бц (програмски језик)
![]() | Ovom članku je potrebna lektura teksta. To podrazumeva ispravku gramatičkih, pravopisnih i interpunkcijskih grešaka ili tona. |
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. -l
opcija 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 | uredi izvor]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 | uredi izvor]Exactly as C
[uredi | uredi izvor]Sledeći POSIKS bc operateri se ponašaju isto kao njihove C kolege:
+ - * / += -= *= /= ++ -- < > == != <= >= ( ) [ ] { }
Slično C
[uredi | uredi izvor]
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 | uredi izvor]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 | uredi izvor]Bulovi i kondicionalni operateri:
& | ^ && || &= |= ^= &&= ||= << >> <<= >>= ?:
... nisu mogući u POSIKS bc.
Ugrađene-u funkcije
[uredi | uredi izvor] 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 | uredi izvor]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 | uredi izvor]Plan 9 bc je kao POSIKS bc ali za dodatne print
izjave.
GNU bc
[uredi | uredi izvor]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 | uredi izvor]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 | uredi izvor]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 | uredi izvor]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 | uredi izvor] /* Функција враћа цео број дела 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 | uredi izvor] # Функција која враћа целобројни део броја
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 | uredi izvor]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 | uredi izvor]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 | uredi izvor]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 | uredi izvor]Reference
[uredi | uredi izvor]- ^ The Single UNIX® Specification, Issue 7 from The Open Group : arbitrary-precision arithmetic language – Commands & Utilities Reference,
- ^ GNU bc manual page
Spoljašnje veze
[uredi | uredi izvor]- Dittmer, I. 1993. Error in Unix commands dc and bc for multiple-precision-arithmetic. SIGNUM Newsl. 28, 2 (Apr. 1993), 8–11.
- Online version of GNU bc
- Collection of useful GNU bc functions
- GNU bc (and an alpha version) from the Free Software Foundation
- bc for Windows from GnuWin32
- X-bc - A Graphical User Interface to bc
- extensions.bc - contains functions of trigonometry, exponential functions, functions of number theory and some mathematical constants
- scientific_constants.bc - contains particle masses, basic constants, such as speed of light in the vacuum and the gravitational constant