бц (програмски језик)

bc, za osnovni kalkulator (koji se često naziva klupa kalkulator), je "proizvoljne preciznosti kalkulator" sa sintaksom sličnom C programskom jeziku. bc se obično koristi kao matematička skripta jezika ili kao interaktivna matematička ljuska.[1][2] 

Tipična interaktivna upotreba piše komandnu bc na Juniks komandnoj liniji i ulazi u matematički izraz, kao što su  (1 + 3) * 2, nakon čega 8 će biti izlaz. Dok bc može da radi sa proizvoljnom preciznošću, zapravo kasni na nulu cifara nakon decimalnog zareza-tako da izraz  2/3 prinosi 0. Ovo može iznenaditi nove bc korisnike nesvesne te činjenice.  -lopcija za bc određuje osnovnu skalu (cifre nakon decimalnog zareza) do 20, i dodaje još nekoliko matematičkih funkcija u jeziku. 

bc se prvi put pojavio u verziji 6 Juniksa 1975. godine, a napisali su ga Robert Moris i Lorinda Keri u Bel Labu. bc je prethodio dc, raniji kalkulatori proizvoljne preciznosti su pisani od strane istih autora. dc je mogao da vrši kalkulacije proizvoljno preciznosti, ali njegova obrnuta poljska notacija (RPN) sintaksa je nezgodna za korisnike, a samim tim bc je napisan kao front-end u dc-u. Bc je bio veoma jednostavan kompajler (jedan Yacc izvorni fajl sa nekoliko stotina linija), koji pretvara novi, kao C, bc sintaksa u dc je postfik notacija, i prosleđuje rezultate kroz dc. 

1991,POSIKS strogo definiše i standardizuje bc. Dve implementacije ovog standarda su preživele do danas: Prva je tradicionalna implementacija Juniks i  prednji-kraj dc, koji opstaju u Juniksu i plan 9 sistemima. Drugi je slobodan softver GNU-bc, prvi put objavljen 1991. godine od strane Filipa A. Nelsona. Implementacija GNU ima brojna proširenja izvan POSIKS standarda, i nije više prednji kraj dc (to je bajtkod interpretator). 

POSIKS bc uredi

POSIKS standardizovani bc jezik tradicionalno napisan kao program na dc programskom jeziku da obezbedi viši nivo pristupa karakteristika dc jezika bez kompleksnosti dc kratke sintakse. 

U ovoj formi, bc programski jezik sadrži pojedinačne promenljive, nizove i imena funkcija i najstandardnije aritmetičke operatere kao što su kontrola protoka konstrukcije, (if(cond)..., while(cond)... i for(init;cond;inc)...) od C. Za razliku od C,  if ne mora biti praćeno sa else.

Funkcije su definisane korišćenjem reči define i vrednosti koje se vraćaju njihovim korišćenjem return praćene povratnom vrednošću u zagradama. Reč auto (opcionalna u C) je korišćena da deklariše promenljivu kao lokalnu funkciju.

Svi sadržaji brojeva i promenljivih su proizvoljne preciznosti brojeva čije preciznosti (u decimalama) su određene globalnim scale promenljivama.

Numerička baza ulaza (u interaktivnom režimu), izlaza i programa konstanti može da se odredi postavljanjem rezervisanih ibase (ulaznih baza) i obase (izlaznih baza) promenljivih.

Izlaz je generisan od strane namernog nedodeljivanja rezultata izračunavanja u promenljivoj.

Komentari se mogu dodati na bc kod korišćenjem C  /* i */ (početak i kraj komentara) simbola.

Matematički operateri uredi

Exactly as C uredi

Sledeći POSIKS bc operateri se ponašaju isto kao njihove C kolege:

 +     -     *     /
 +=    -=    *=    /=
 ++    --    <     >
 ==    !=    <=    >=
 ( )   [ ]   { }

Slično C uredi

Operateri kongruencije, % & %= ponašaju se kao njihove C kolege samo kada je globalna  scale promenljiva postavljena na 0, odnosno svi proračuni su celi brojevi. U suprotnom računanje se vrši sa odgovarajućom skalom. a%b je definisano kao a-(a/b)*b . Primeri:

$ bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
scale=0; 5%3
2
scale=1; 5%3
.2
scale=20; 5%3
.00000000000000000002

Samo nalik C uredi

Operateri:

 ^     ^=

... podsećaju na C ekskluzivne-ili operatere, ali su u stvari bc celi brojevi stepenovanih operatera.

Od posebnog značaja, korišćenje ^ operatera sa negativnim brojevima ne prati prednost C operatera. -2 ^ 2 bc daje odgovor 4 češće nego -4.

"Nedostajanje" operatera u odnosu na C uredi

Bulovi i kondicionalni operateri:

 &     |     ^     &&    ||
 &=    |=    ^=    &&=   ||=
<<    >>
<<=   >>=
?:

... nisu mogući u POSIKS bc.

Ugrađene-u funkcije uredi

 sqrt() funkcija za izračunavanje kvadratnog korena je POSIKS bc-ova funkcija samo ugrađena-u matematičkoj funkciji. Druge funkcije su moguće u spoljašnjim standardnim bibliotekama.

scale() funkcija za određivanje preciznosti (kao sa scale promenljivom) njihovih argumenata i length() funkcija za određivanje broja značajnih decimala u njihovim argumentima su takođe ugrađene-u.

Standardne funkcije biblioteke uredi

Standardna matematička biblioteka bc-a (definisana sa -L opcijom) sadrži funkcije za izračunavanje sinusa, kosinusa, arkus tangensa, prirodnog logaritma, eksponencijalne funkcije i dva parametra Beselove funkcije J. Većina standardnih matematičkih funkcija (uključujući i druge inverzne trigonometrijske funkcije) može biti izgrađena korišćenjem ovih. Pogledajte eksterne linkove za implementaciju mnogih drugih funkcija. 

-l opcija menja obim do 20 (izvora), tako da stvari kao što su modul mogu da rade neočekivano. Na primer, pisanje "bc-L", a zatim komandu  "piše 3%2" izlaza 0. Ali pisanje "obim=0" posle "bc-L"a onda komanda "piše 3%2" će izbaciti 1.

Plan 9 bc uredi

Plan 9 bc je kao POSIKS bc ali za dodatne print izjave.

GNU bc uredi

GNU bc proizlazi iz POSIKS standarda i uključuje mnoga poboljšanja. Potpuno je odvojen od dc-osnovne implementacije POSIKS standarda i umesto toga je pisan u C. Ipak, je potpuno kompatibilan kao svi POSIKS bc programi koji će se pokrenuti nemodifikovano kao GNU bc program. 

GNU bc promenljive, nizovi i imane funkcija mogu da sadrže više od jednog karaktera, neki operateri su više uključeni iz C, a naročito if klauzula može biti praćena sa else.

Izlaz je postignut ili namerno nedodeljivanjem rezultata izračunavanje promenljivoj (POSIKS način) ili pomoću dodate print izjave.

Pored toga, read izjava dozvoljava interaktivni unos jednog broja u već pokrenut obračun.

Pored komentara C-stila, # će izazvati sve posle toga do sledeće nove linije koja će se ignorisati.

Vrednost poslednjeg proračuna uvek se čuva u dodatnoj ugrađenoj last promenljivoj.

Ekstra operateri uredi

Sledeći logički operateri su navedeni u POSIKS bc: 

&& || !

... i dostupni su za upotrebu u uslovnim iskazima (kao što je u okviru if izjava). Napomena, međutim, da još uvek nema ekvivalentnih dodeljivanja operacija. . 

Funkcije uredi

Sve funkcije koje su dostupne u GNU bc su nasleđene od POSIKS-a . Nema više funkcija koje su date kao standardi sa distribucijom GNU. 

Primer koda uredi

Od kada bc  ^ operater dozvoljava samo ceo broj snage na svoje desno, jedna od prvih funkcija koje bi korisnik bc mogao da napiše je funkcija snage sa pokretnim zarezom eksponenta. Oba ispod pretpostavljaju da je standardna blioteka uključen: 

Funkcija "snage" u POSIKS bc uredi

 /* Функција враћа цео број дела x */
 define i(x) {
    auto s
    s = scale
    scale = 0
    x /= 1   /* round x down */
    scale = s
    return (x)
 }

 /* Користе чињеницу да је x^y == e^(y*log(x)) */
 define p(x,y) {
    if (y == i(y)) {
       return (x ^ y)
    }
    return ( e( y * l(x) ) )
 }

Ekvivalentna "snaga" funkcija u GNU bc uredi

 # Функција која враћа целобројни део броја
 define int(number) {
    auto oldscale
    oldscale = scale
    scale = 0
    number /= 1 /* round number down */
    scale = oldscale
    return number
 }
 
 # Користе чињеницу да је number^exponent == e^(exponent*log(number))
 define power(number,exponent) {
    if (exponent == int(exponent)) {
       return number ^ int(exponent)
    } else {
       return e( exponent * l(number) )
    }
 }

Izračunavanje Pi-a do hiljadu mesta uredi

Izračunajte pi koristeći ugrađenu arkus tangens funkciju, a().

$ bc -lq
scale=10000
4*a(1) # Атан 1 је 45 степени, што је Пи/4 у радијанима.
       # Ово ће можда потрајати неколико минута док се израчуна.

Prevedena C funkcija uredi

Zato što je sintaksa BC slična onoj od C, objavljene numeričke funkcije napisane u C se često mogu prevesti u bc prilično lako, koji odmah daje proizvoljnu preciznost BC. Na primer, u časopisu statističkog softvera (jula 2004, Ton 11, Izdanje 5), Džordž Marsaglia je objavio sledeći C kod za kumulativnu normalnu distribuciju

double Phi(double x)
{
    long double s=x,t=0,b=x,q=x*x,i=1;
    while(s!=t)
        s=(t=s)+(b*=q/(i+=2));
    return .5+s*exp(-.5*q-.91893853320467274178L);
}

Sa nekim neophodnim promenama da prihvati BC drugačiju sintaksu, a shvatajući da je konstanta "0,9189 ... " zapravo log(2*Pi)/2, to se može prevesti na sledeći GNU bc kod:

define phi(x) {
    auto s,t,b,q,i,const
    s=x; t=0; b=x; q=x*x; i=1
    while(s!=t)
        s=(t=s)+(b*=q/(i+=2))
    const=0.5*l(8*a(1))   # 0.91893...
    return .5+s*e(-.5*q-const)
}

Korišćenje bc u skriptama uredi

bc se može koristiti ne-interaktivno, sa ulazima preko cevi. Ovo je korisno u skriptama. Na primer: 

$ result=$(echo "scale=2; 5 * 7 /3;" | bc)
$ echo $result
11.66

Nasuprot tome, imajte na umu da Baš ćelija jedina obavlja aritmetiku celih brojev, npr: 

$ result=$((5 * 7 /3))
$ echo $result
11

Takođe se može koristiti hir- string idiomom (u baš, kš, cš)

$ bc -l <<< "5*7/3"
11.66666666666666666666

Vidi još uredi

Reference uredi

  1. ^ bc: arbitrary-precision arithmetic language – Commands & Utilities Reference, The Single UNIX® Specification, Issue 7 from The Open Group
  2. ^ GNU bc manual page

Spoljašnje veze uredi