bc(1)


NÉV

bc : tetszôleges pontosságú számokkal dolgozó kalkulációs nyelv

SZINTAXIS

bc[ -lws ] [ file ... ]

VERZIÓ

Ebben a dokumentumban a GNU bc 1.03 -as verzió leírása szerepel.

LEÍRÁS

A bc lehetôséget nyújt a tetszôleges pontosságú számokkal való interaktív utasítások végrehajtására. Van néhány szintaktikai hasonlósága a C nyelvvel. Az alap matematikai könyvtár a parancssorból hívható meg. Kívánság szerint a matematikai könyvtár a file-okon végzett mûveletek elôtt átdefiniálható. A bc indulásakor feldolgozza a parancssorban megadott file-okban levô utasításokat ( a file-nevek sorrendjében ) majd ezután a standard inputról olvas. Minden utasítást rögtön a beolvasás után végrehajt ( így pl. ha egy file egy olyan utasítást tartalmaz amely megállítja a process-t akkor a bc nem olvas tovább a standard inputról. )

Ez a verzió a szokásos bc-hez és az egyszerû POSIX bc-hez képest számos kiegészítô szolgáltatással szolgál, így lehetséges, hogy más bc verziókkal megírt programok futtatásakor hibaüzenetet kapunk. A megfelelô helyen majd erre vonatkozó megjegyzéseket találhatunk.

KAPCSOLÓK

-l
az alap matematikai könyvtárat használja
-w
POSIX bc program futtatása esetén a kiegészítô utasítások használata esetén hibaüzenetet ad
-s
POSIX bc szerint hajtja végre az utasításokat

SZÁMOK

A legalapvetôbb egység a szám. A számok tetszôleges pontosságúak ( mind az egész, mind a tört rész ). A számok tárolása és a velük végzett mûveletek mind decimálisan történnek. ( Ez a verzió szorzás és osztás esetén végezhet esetleges (lefele-)kerekítéseket ). A számoknak két attribútuma a hossz és a pontosság ( scale ): a hossz az összes tizedes jegy, míg a pontosság pedig a tizedespont mögött álló jegyek számát jelenti. Pl. :

.000001 hossza 6, pontossága 6; 1935.000 hossza 7, pontossága 3.

VÁLTOZÓK

A számokat kétféle változóban tárolhatjuk: egyszerû változókban ill. tömbökben ( mindkét fajtára nevekkel hivatkozhatunk ). A nevek betûvel kezdôdnek, majd tetszôleges számú betû, szám vagy aláhúzás (_) karakter szerepelhet. A betûk kisbetûsek kell, hogy legyenek. ( Egy betûkbôl és számokból álló kifejezések használata plusz szolgáltatás. A POSIX-ben a nevek csak kisbetûket tartalmazhatnak). Egy változó típusa a környezetébôl rögtön kideríthetô, mivel a tömbváltozók nevét [ ] követi.).

4 speciális változó van a bc-ben: scale, ibase, obase és a last. A scale változó a tizedespont után álló jegyekkel végzett néhány utasítás végrehajtását szabályozza ( kezdeti értéke 0 ). Az ibase ill. obase adja meg, hogy hányas számrendszerben kezeli a ki- ill. bemenô adatokat ( mindkettô kezdeti értéke 10 ). A last értéke mindig az éppen kiirt szám értéke ( Ennek részletesebb tárgyalását lásd késôbb. ). Ezen változóknak is a megszokott módon adhatunk értéket.

MEGJEGYZÉSEK

A megjegyzéseket /* ill. */ karakterek határolják; bárhol kezdôdhetnek és egyetlen szóközként jelennek meg a bemeneten. ( Ez viszont az utasításokat némiképp megváltoztathatja, ezért pl. egy változó nevén belül nem szerepelhet megjegyzés. ). Egy megjegyzésen belül azonban akárhány sortörés szerepelhet.

KIFEJEZÉSEK

A számok általában kifejezésekben és utasításokban fordulnak elô. A nyelv interaktív mivoltából kifolyólag az utasításokat és kifejezések a lehetô leghamarabb kifejti a bc. Itt nincs "fôprogram" . Az utasítások rögtön a kiadásuk után végrehajtásra kerülnek. ( A függvények definiálását ld. késôbb ).

Egyszerû kifejezés pl. egy konstans. A konstansokat az ibase értékének megfelelôen alakítja át decimális számokká a bc. ( A függvényeknél van ez alól kivétel ). Az ibase lehetséges értéke 2 .. 16 (F). Ha ezen az intervallumon kívüli számot adunk meg akkor az ibase értéke egy 2..16 beli számot vesz fel. A bemenô adatok a 0..9 ill. A-F karaktereket tartalmazhatják. ( Megjegyzés: Fontos, hogy nagybetût használjunk, mivel a kisbetûk változókat jelölnek ). Az egyjegyû számok értéke mindig a decimális érték az ibase-tôl függetlenül. (pl. A = 10 ). Többjegyû számok esetén az ibase értékénél nem kisebb jegyeket ibase-1 -é alakítja. Így az FFF szám az ibase értékétôl függetlenül mindig a legnagyobb értékû 3-jegyû számot jelenti ( abban a számrendszerben ).

A összetett kifejezések számos más magas szintû nyelvbelihez hasonlítanak. Mivel egyetlen típusú szám létezik, így a típuskonverziókra nincs is szabály;nem úgy a kifejezések pontosságára. Minden kifejezés adott pontosságú. Ez az eredeti számoktól, az elôforduló operandusoktól és sok esetben a változók pontosságától függ. A változók pontosságának értéke 0-tól a C nyelv beli integer felsô határáig terjedhet.

A következô példákban az "expr" egy teljes kifejezésre, míg a "var" egy egyszerû vagy tömbváltozóra utal. ( Egy egyszerû változó pl. name, ill. tömbváltozó name[expr] ).

Minden specialitás nélkül az eredmény pontossága a kifejezésben szereplô tagok pontosságának a maximuma.

- expr
Értéke: expr ellentettje
++ var
Értéke: A var változó 1-gyel növelve.
-- var
Értéke: A var változó 1-gyel csökkentve.
var ++
Értéke: var ( és ezután az értéke 1-gyel nô )
var --
Értéke: var ( és ezután az értéke 1-gyel csökken )
expr + expr
Értéke: a két kifejezés összege
expr - expr
Értéke: a két kifejezés különbsége
expr * expr
Értéke: a két kifejezés szorzata
expr / expr
Értéke: a két kifejezés hányadosa. Az eredmény pontossága a scale értéke.
expr % expr
Értéke: az osztás maradéka ( A következôképpen számolva: elôször a/b értékét kiszámolva a scale-ben megadott pontosságig, majd az a-(a/b)*b kiszámítva a max( scale + scale(b), scale(a) ) pontossággal. Ha scale=0 és mindkét kifejezés értéke egész akkor a kifejezés értéke megegyezik a maradékos osztással kapott eredménnyel.
expr ^ expr
Értéke: a két kifejezés hatványa. A második kifejezés egész kell, hogy legyen. ( Ha a második nem egész akkor hibaüzenet után kerekíti az értékét ). Ha a kitevô negatív akkor az eredmény pontossága: scale. Ha pozitív akkor scale(a^b) = min (scale(a)*b, max (scale, scale(a)) ). Expr^0 értéke mindig 1.
( expr )
A kifejezéseken belüli mûveletek precedenciájának megváltoztatására szolgál
var = expr
var felveszi az expr értékét
var <op>= expr
Értéke ua. mint a var = var <expr> ( Tömbök esetén lehetséges különbség ).

A relációk speciális kifejezések melyek értéke 0 vagy 1, attól függôen, hogy a reláció hamis ill. igaz( tetszôleges kifejezésekben elôfordulhatnak ). A POSIX bc-ben a relációk csak if, while vagy for kifejezésekben szerepelhetnek és ott is csak egyszer . A megengedett relációk a következôk:

expr1 < expr2
Értéke: 1 ha expr1 kisebb mint expr2.
expr1 <= expr2
Az eredmény 1, ha expr1 kisebb vagy egyenlô, mint expr2.
expr1 > expr2
Az eredmény 1, ha expr1 szigorúan nagyobb, mint expr2.
expr1 >= expr2
Az eredmény 1, ha expr1 nagyobb vagy egyenlô, mint expr2.
expr1 == expr2
Az eredmény 1, ha expr1 egyenlôl expr2-vel.
expr1 != expr2
Az eredmény 1,ha expr1 nem egyenlô expr2-vel.

Logika mûveletek szintén megengedettek. (a POSIX bc-nek nincsenek logikai mûveletei. A logikai mûveletek eredménye 0 vagy 1 (a hamis vagy igaz helyett) akárcsak a relációs kifejezéseknél. A logikai mûveletek a következôk:

!expr
Az eredmény 1, ha expr értéke 0.
expr && expr
Az eredmény 1, ha egyik kifejezés értéke sem nulla.
expr || expr
Az eredmény 1, ha valamelyik kifejezés értéke nem nulla.

A mûveleti sorrend a következô (az utolsótól az elsôig):

|| mûvelet, balról asszociatív && mûvelet, balról asszociatív ! mûvelet, nem asszociatív Relációs mûveletek, balról asszociatívak Értékadás mûvelet, jobbról asszociatív + és - mûveletek, balról asszociatívak *, / és % mûveletek, balról asszociatívak ^ mûvelet, jobbról asszociatív unary - mûvelet, nem asszociatív ++ és -- mûveletek, nem asszociativak

A sorrend azért lett így választva, hogy a POSIX szerinti bc programok helyesen fussanak. Emiatt a relációs és logikai mûveletek értékadással való használata, néhány szokatlan eredményt hozhat. Nézzük például a következô kifejezést:

a = 3 < 5

A legtöbb C programozó azt várná, hogy az "a" változóba a "3 < 5" (1) értékét tesszük. Itt viszont az történik, hogy a bc a 3-at adja értékül "a" -nak, majd ezt összehasonlítja az 5-tel. Jobb zárójelet használni, mikor relációs, vagy logikai mûveletket használunk értékadással együtt.

A bc még néhány különleges kifejezéssel szolgál. Ezeket a felhasználó által definiált, vagy beépített eljárásokkal együtt használjuk. Mind úgy tûnik fel, mint "név(paraméterek)". Lásd az eljárások felhasználó által definiált eljárásokhoz fejezetet. A beépített eljárások a következôk:

length ( kifejezés )
A length funkció értéke a kifejezésben levô számjkegyek száma.
read ( )
A read funkció (egy kiterjesztés) egy számot olvas be a standard input-ról, figyelmen kívül hagyva, hogy az eljárás éppen hol tart. Vigyázat ez problémát okozhat, azzal, hogy összekeveri az adatot és a programot a standard input-on. A funkció használatának legjobb módja, elôre megírt program, melynek a felhasználótól van szüksége input-ra, de nem engedi, hogy a felhasználó programkódot vigyen be. A read funkció értéke a standard inputról beolvasott szám az átszámítási táblázat szerint, melyhez a változtatható ibase pillanatnyi értékét használjuk.
scale ( kifejezés )
A scale funkció értéke a számjégyek száma a kifejezésben a tizedesvesszô után.
sqrt ( kifejezés )
Az sqrt funkció értéke a kifejezés négyzetgyöke. Ha a kifejezés értéke negatív, run time error lép fel.

Állítások

Az állítások (mint a legtöbb algebrai nyelvben) elkészítik a kifejezés sorrendjének kiértékelését. A bc-ben olyan gyorsan hajtódnak végre az állítások, amennyire csak lehet. A végrehajtás akkor történik,amikor egy új sor következik és egy, vagy több állítás szerepel. Az azonnali végrehajtás következtében az új sorok, nagyon fontosak a bc-ben. Valójában mindkettô, mind a pontosvesszô, mind az új sor hasznalható állítás szeparátorként. Mivel az új sorok állítás szeparátorok, ezért egy új sort a backslash karakter használatával lehetséges elrejteni. A számsor "\<nl>", ahol <nl> egy új sor, a bc-nek whitespacenek tünik újsor helyett.Egy állítás lista vesszôkkel és újsorokkal elkülönített állítások sorozata.Bc állítások listája következik, és hogy mire használhatók, azokat a dolgokat, melyek nem kötelezô részei az állításoknak, zárójel veszi körül ([]).

Kifejezés
Az állítás egy vagy két dolgot csinál.Ha a kifejezés kezdete "<változó><feladat>" akkor összeveti a feladat állítását. Ha a kifejezés nem egy kijelölt állítás ,a kifejezést kiértékeli és kinyomtatja az outputra. Miután a szám ki lett nyomtatva egy új sort is kinyomtat.Például "a=1" egy kijelölt állítás és (a=1) egy beágyazott kijelölt kifejezés. A nyomtatásban minden szám az elôírt nyolcas számrendszerû változó. A legális értékek a nyolcas helyett a kettestôl a BC_BASE_MAX-ig terjednek.( Lásd határok) A kettes alapútól a tizenhatosig a számok kiírásának szokásos eljárása. Ha a tizenhatosnál nagyobb alapú, akkor a bc egy sok-karakteres számjegy eljárást használ a számok kiírására, ahol más, a tizesnél magasabb alapú számjegyeket nyomtat.A számjegyek szóközzel vannak elválasztva. Más számjegyek tartalmazzák a szükséges karakterek számát, hogy tizesalapú számrendszerben ábrázolják "8-1" értékét. Mivel tetszôleges számok pontos értéke közül néhány nem nyomtatható egy egyszerû kimeneti sorba, ezek a hosszú számok szét lesznek választva több sorba egy "\"-el, ami az utolsó karakter egy sorban. A karakterek maximum számának 70%-t lehet kinyomtatni.A bc nyomtatásának interaktív természete következtében a kijelölt kinyomtatott értékekhez képest a végeredmény egy különleges változó.Ez megengedi a felhasználónak, hogy visszakapja a végeredmény értékét anélkül, hogy újra elvégezné a kifejezést, ami kinyomtatta a számot. A végeredmény kijelölése legális, és felülírja az utolsó kinyomtatott értéket a meghatározott értékkel. Az újonnan kijelölt érték addig marad meg amíg a következô számot kinyomtatja vagy más értéket jelöl ki végeredményként. (Néhány installació talán megengedi az egyes rövidítések használatát, ami nem része egy számnak, a végeredmény átírása helyett.
string
A string az outputra kinyomtatott érték. A stringek idézôjel karakterrel kezdôdnek és tartalmaznak minden karaktert a következô idézôjelig. Minden karakter amit szószerint kell értelmezni tartalmazhat valamennyi új sort. A nem új sor karakter a string után van nyomtatva.
Nyomtatási lista
A nyomtatás állítás (egy kiterjesztés) gondoskodik más kimeneti eljárásról. A "list" egy stingeket, kifejezéseket tartalmazó vesszôvel elkülönített lista. Más stringek vagy kifejezések más sorrendû listában vannak kinyomtatva. A nem befejezett sort is kinyomtatja. A kifejezéseket kiértékeli, az értéküket kinyomtatja, és kijelöli a végeredmeny változót.A stringek a nyomtatási állapotban az outputra vannak kinyomtatva és lehet, hogy speciális karaktereket is tartalmaznak. A speciális karakterek backslash-el kezdôdnek(\). A bc által elismert karakterek:"a"(riadó vagy csengô),"b"(szóköz),"f"(formai átalakítás),"n"(idézôjel),"t"(tab) és "\"(backslash). Más karaktereket amik a backslash-t követik nem fogja tudomásul venni.
{ Állítás lista }
Ezek többszörösen összetett állítások. A többszörösen összetett állítások csoportonkénti együttes végrehajtása megengedhetô.
if (kifejezés) then állítás1 [elseállítás2]
Ha az állítás kiértékelése a kifejezés és az egyes vagy kettes állítás kiértékelése a kifejezés értékén múlik. Ha a kifejezés nem nulla,az állítás1 kiértékelhetô. Ha az állítás2 az aktuális és a kifejezés értéke nulla, akkor az állítás2 végrehajtható. ( A másik feltétel egy kiterjesztés.)
while ( kifejezés ) állítás
A while állítás végrehajtható állítás, amíg a kifejezés nem nulla. Ennek a kifejezésnek a kiértékelése azelôtt történik,mielôtt más állítás végrehajtódna. A ciklus befejezését a nulla értékû kifejezés vagy egy szünet állapot végrehajtása okozza.
for ([kif1];[kif2];[kif3]) állítás
A for állítás megismétli az állítás végrehajtását. Az elsô kifejezés kiértékelése a ciklus elôtt történik. A második kifejezés kiértékelése más állítás végrehajtása elôtt történik. Ha ez nem nulla, az állítás kiértékelhetô. Ha nulla, a ciklus véget ér. Más végrehajtható állítás után a kifejezés3 kiértékelôdik mielôtt újraértékelôdött volna a kifejezés2. Ha a kifejezés1 vagy a kifejezés3 hiányzik nem szükséges a kiértékelésük. Ha a kifejezes2 hiányzik ez ua. mintha helyettesítenénk az egyes értéket a a kifejezes2 helyett. ( A szabadon választható kifejezés egy kibôvítés. A POSIX bc-nek szükséges mindhárom kifejezés. ) A következôk megfelelô ekvivalenciák a for ciklus állítások helyett

kif11; while (kif2) { állítás; kif3; }

break
Ez az állítás egy kikényszerített exit, amit a legtöbb újkeletû végtelen ciklus vagy állítás okoz.
continue
A folytatás állítás ( egy kiterjesztés ), amit a legtöbb befejezetlen állítás helyett, újrakezdi a következô mûveletet.
halt
A halt egy (kibôvített) állítás , amit a bc processzor okoz, amikor végrehajtás közben lép ki. Például "ha (0==1)akkor megszakítás" -nem okozza a bc befejezôdését, mert a megszakítás nem végrehajtható.
return
Egy függvény visszatérési értéke nulla. (Lásd sorozatok vagy függvények)
return ( kifejezés )
Visszaadja a kifejezés értékét . (Ld. függvények)

NEM VALÓDI UTASÍTÁSOK

Ezek az utasítások nem a hagyományos értelemben vett utasítások, ezek ugyanis nem futtatható utasítások. A funkciójukat "fordítási" idôben töltik be.

limits
Kiírja a korlátait a bc helyben lévô verziójának. Ez egy bôvítés.

quit
Mikor a quit parancs beolvasódik, a bc processzor megáll, figyelembe véve azt, hogy a quit parancsot hol találta. Például az "if (0 == 1) quit" azt eredményezi, hogy a bc megáll.

warranty
Kiír egy hosszabb jótállási üzenetet. Ez egy bôvítés.

FÜGGVÉNYEK

A függvények gondoskodnak egy számítás definiálásáról, amit késôbb futtatni lehet. A függvények bc-ben mindig kiszámítanak egy értéket és visszaadják a hívónak. A függvények definíciói "dinamikusak" abban az értelemben, hogy egy függvény definiálatlan addig, amíg egy definícióval nem találkozik a bemeneten. Ezután a definíció addig él, amíg újabb definíciót nem kap ugyanazon a néven. Ekkor az új definíció fölülírja a régit. Egy függvényt a következôképp kell definiálni :
define name ( paraméterek ) {újsor auto_list statement_list }
A függvény hivása a következô formában lehetséges : "név(paraméterek)".

A paraméterek számok vagy tömbok (ez egy bôvítés). A függvény definícióban nulla vagy több paramétert a nevük vesszôvel elválasztott listájával adunk meg. A számokat csak érték szerinti paraméterrel hivhatunk, tömböket csak változóval. Tömböket a paraméter definícióban specifikálunk a "name[]" jelöléssel. A függvény hívásában az aktuális paraméterek teljes kifejezések szám paraméterek számára. Ugyanez a jelölés használatos tömbök beillesztésére definíciós tömb paraméterekként. A megnevezett tömb változóval illesztôdik be a függvénybe. Mióta a függvénydefiníciók dinamikusak, a paraméterszámok és típusok ellenôrzôdnek, mikor egy függvényt meghívunk. Bármi eltérés a paraméterek számában vagy típusában futáshibát okoz. Futási hiba keletkezik akkor is, ha egy definiálatlan függvényt hívunk meg.

Az auto_list egy opcionális lista olyan változóknak, amiket "helyben" használunk. Az auto_list (ha létezik) szintaxisa "auto név, ... ;". (A pontosvesszô opcionális.) Minden név egy auto változó neve. Tömböket hasonló jelöléssel lehet specifikálni, mint a paramétrereknél. A függvény kezdetekor a változók értékei bekerülnek egy verembe, ezután az változók nulla értékkel indulnak, és használódnak a futtatás alatt. A használat befejeztével ezek a változók kikerülnek a verembôl, így a függvény hívásakori eredeti értékek állítódnak vissza. A paraméterek auto változók, amelyek beállítódnak egy függvényhíváskori értékre. Az auto változók különböznek a hagyományos lokális változóktól abban, hogy ha A függvény meghívja B függvényt, a B B elfogadhatja az A auto változóit azáltal, hogy ugyanazokat a neveket használja, hacsak B nem az ô auto változóiként hívta meg ôket. Annak megfelelôen, hogy az auto változók és a paraméterek egy verembe kerülnek, bc támogatja a rekurzív függvényeket.

A függvény törzse egy lista bc parancsokbol. A parancsok most is pontosvesszôvel vagy újsor karakterrel vannak elválasztva. A visszatérési parancsok gondoskodnak a függvény befejeztérôl és egy érték visszaadásáról. Kétfajta visszatérési parancs létezik. Az elsô formája "return" visszaadja a 0 értéket a hívó kifejezésnek. A második forma, "return ( kifejezés )", kiszámolja a kifejezés értékét, és azt az értéket adja vissza. Minden függvény végén egy "return (0)" van. Ez engedélyezi a függvénynek, hogy megálljon és 0-t adjon vissza explicit visszatérési utasítás nélkül.

A függvények különböznek az ibase változó használatában is. Minden függvénytörzsbeli konstans átalakítódik az ibase meghíváskori értékének használatával a függvény meghívásakor. Az ibase változásai figyelmen kívül lesznek hagyva a függvény futása alatt, kivéve a read alapfüggvényt, amely mindig az ibase aktuális értékét használja számok konvertálásához.

MATH FÜGGVÉNYKÖNYVTÁR

Ha a bc a -l opcióval lett meghívva, egy matematikai függvénykönyvtár elôre betöltôdik és az alap pontosság 20 lesz. A matematikai függvények az eredményeiket a hívásukkori pontossággal számolják. A math függvénykönyvtár a következô függvényeket definiálja :

s (x)
x szinusza radiánban.

c (x)
x koszinusza radiánban.

a (x)
x arcus tangense.

l (x)
x természetes alapú logaritmusa.
e (x)
e alapú exponenciális függvény.
j (n,x)
x Bessel függvénye ahol n egész

PÉLDÁK

A /bin/sh-ban a következôképpen adhatjuk át "pi" értéket a pi shell változónak.

pi=$(echo "scale=10; 4*a(1)" | bc -l)

A következô példa az exponenciális függvényt definálja, ahogyan az a matematikai könyvtárban található. Ezt a függvényt POSIX bc-ben írták.

scale = 20
/* Azt a tényt felhasználva, hogy e^x = (e^(x/2))^2 Amikor az x eléggé kicsi, sorozatokat használunk: e^x = 1 + x + x^2/2! + x^3/3! + ... */
define e(x) { auto a, d, e, f, i, m, v, z
/* Az x elôjelét vizsgálja meg. */ if (x<0) { m = 1 x = -x }
/* x elôfeltétel. */ z = scale; scale = 4 + z + .44*x; while (x > 1) { f += 1; x /= 2; }
/* Változók inicalizálása. */ v = 1+x a = x d = 1
for (i=2; 1; i++) { e = (a *= x) / (d *= i) if (e == 0) { if (f>0) while (f--) v = v*v; scale = z if (m) return (1/v); return (v/1); } v += e } }

A következí példa a bc kiterjesztett tulajdonságait használja fel ahhoz, hogy egy egyszerû programmal elvégezze egy csekkönyv egyenlegének kiszámítását. Legcélszerûbb ezt a programot egy fájlban tartani, hogy többször fel lehessen használni újragépelés nélkül.

scale=2 print "\nCsekkonyv program!\n" print " Emlekeztetoul, a betet negativ tranzakcio.\n" print " Kilepes 0-s tranzakcioval.\n\n"
print "Kezdo egyenleg? "; bal = read() bal /= 1 print "\n" while (1) { "Jelenlegi egyenleg = "; bal "tranzakcio? "; trans = read() if (trans == 0) break; bal -= trans bal /= 1 } quit

A következô példa a rekúrzív faktoriális függvény definiciója.

define f (x) { if (x <= 1) return (1); return (f(x-1) * x); }

KÜLÖNBSÉGEK

A bc-nek ez a verziója a POSIX P1003.2/D11-tól van bevezetve és tartalmaz néhány különbséget és bôvítést a hagyományos kivitelezéshez képest. Nem a hagyományos módon van bevezetve a dc(1) felhasználásával. Ez a verzió egy egyszerû feldolgozó, amelyik elemzi és futtatja a programnak egy byte kódú fordítását. Van egy "nem dokumentált" opció, aminek hatására a program az alapértelmezett kimenetre küldi a byte kódot ahelyett, hogy lefuttatná. Ezt fôként az elemzés debuggolásához és a matematikai könyvtár elôkészítéséhez használták.

Egy nagyobb különbségek forrása a fejlesztés maga, amikor egy jellemzôjét kibôvítették, több funkcióval látták el. A következô lista tartalazza a különbségeket és a bôvítéseket.

LANG környezet
Ez a verzió nem illeszkedik a POSIX szabványhoz a LANG környezeti változó feldolgozásában, és minden környezeti változó LC_-vel indul.
nevek
A hagyományos és a POSIX bc-ben egy betûs neve van a függvényeknek, változóknak, tömböknek. Ezek ki lettek bôvítve több karakteres nevekre, amik egy betûvel kezdôdnek, és tartalmazhatnak betûket, számokat, és aláhúzás karaktert.
Sztringek
Szringek nem tartalmazhatnak NUL karaktert. POSIX szerint minden karakter használható sztringben.
last
POSIX bc-ban nincs last változó.A bc néhány változata a pontot (.) használja hasonlóan.
összehasonlítás
POSIX bc csak az if, a while állítasában, és a for állításának második kifejezésében engedi meg az összehasonlítást.
if parancs, else kikötés
POSIX bc nem rendelkezik else kikötéssel
for parancs
a POSIX bc esetében minden paraméternek jelen kell lennie a for állításban.
&&, ||, !
a POSIX bc nem használja a logikai operátorokat.
read függvény
a POSIX bc nem rendelkezik read függvénnyel.
print parancs
POSIX bc bc-nek nincs print parancsa.
continue parancs
POSIX bc nincs continue parancsa
tömb paraméterek
POSIX bc-nek nicsenek tömb paraméterei. A bc más változatai hívhatnak érték szerint tömb paramétereket.
=+, =-, =*, =/, =%, =^
POSIX bc-nek nem szükséges ezeket a "régi stílusú" kijelölô operátorokat definiálni. Ez a verzió megengedheti ezeket a "régi stílusú" kijelöléseket. Használhatjuk a megengedett parancsot annak kiderítésére, hogy a telepített változatunk tartalmazza-e ôket. Ha támogatja a "régi stílusú" kijelölô operátorokat, az "a =- 1" parancs a-t eggyel csökkenteni fogja, ahelyett, hogy a-nak a -1 értéket adná.
szóközök számokban
A bc más változatai megengednek számokban szóközöket. Például "x=1 3" az x változónak a 13-at adja értékül. Ebben a verzióban ez a parancs szintaktikai hibát eredményez.
hibák és futtatás
Ez a változat különbözik abban a többitôl, hogy milyen kódot fordít ha egy szintaktikai vagy más hibát talál a programban. Ha egy szintaktikai hibát talál egy eljárásdefinícióban, a hibakijavíás megpróbálja megkeresni egy parancs elejét, és folytatni a program értelmezését. Amikor szintaktikai hibát talált egy eljárásban, az eljárás nem lesz hívható és definiálatlanná válik. Az interaktív futtatási kódban lévô szintaktikai hibák érvénytelenítik az aktuális futtatási blokkot.

a = 1 b = 2

has two execution blocks and

{ a = 1 b = 2 }

has one execution block. Any runtime error will terminate the execution of the current execution block. A runtime warning will not terminate the current execution block.

Interrupts
During an interactive session, the SIGINT signal (usually generated by the control-C character from the terminal) will cause execution of the current execution block to be interrupted. It will display a "runtime" error indicating which function was interrupted. After all runtime structures have been cleaned up, a message will be printed to notify the user that bc is ready for more input. All previously defined functions remain defined and the value of all non-auto variables are the value at the point of interruption. All auto variables and function parameters are removed during the clean up process. During a non-interactive session, the SIGINT signal will terminate the entire run of bc.

LIMITS

The following are the limits currently in place for this bc processor. Some of them may have been changed by an installation. Use the limits statement to see the actual values.

BC_BASE_MAX
The maximum output base is currently set at 999. The maximum input base is 16.
BC_DIM_MAX
This is currently an arbitrary limit of 65535 as distributed. Your installation may be different.
BC_SCALE_MAX
The number of digits after the decimal point is limited to INT_MAX digits. Also, the number of digits before the decimal point is limited to INT_MAX digits.
BC_STRING_MAX
The limit on the number of characters in a string is INT_MAX characters.
exponent
The value of the exponent in the raise operation (^) is limited to LONG_MAX.
multiply
The multiply routine may yield incorrect results if a number has more than LONG_MAX / 90 total digits. For 32 bit longs, this number is 23,860,929 digits.
code size
Each function and the "main" program are limited to 16384 bytes of compiled byte code each. This limit (BC_MAX_SEGS) can be easily changed to have more than 16 segments of 1024 bytes.
variable names
The current limit on the number of unique names is 32767 for each of simple variables, arrays and functions.

FILES

In most installations, bc is completely self-contained. Where executable size is of importance or the C compiler does not deal with very long strings, bc will read the standard math library from the file /usr/local/lib/libmath.b. (The actual location may vary. It may be /lib/libmath.b.)

DIAGNOSTICS

If any file on the command line can not be opened, bc will report that the file is unavailable and terminate. Also, there are compile and run time diagnostics that should be self-explanatory.

BUGS

Error recovery is not very good yet.

AUTHOR

Philip A. Nelson
phil@cs.wwu.edu

ACKNOWLEDGEMENTS

The author would like to thank Steve Sommars (Steve.Sommars@att.com) for his extensive help in testing the implementation. Many great suggestions were given. This is a much better product due to his involvement.



 
Fordították:
Simon János Györgyredoak@valerie.inf.elte.hu
KatonaEszterkeszter@valerie.inf.elte.hu
Adamcsek Balázsface@valerie.inf.elte.hu
Kiszlinger Ildikókiszi@valerie.inf.elte.hu
Sildó Csaba Istvánzorro@valerie.inf.elte.hu
Somogyvári Tamáshalihow@ludens.elte.hu