bc(1) General Commands Manual bc(1) NIMI bc - Mielivaltaisen tarkkuuden laskentakieli SYNTAKSI bc [ -hlwsqv ] [long-options] [ file ... ] KUVAUS bc on kieli, jolla voidaan toteuttaa vuorovaikutteisesti lauseita, joissa kaytetaan mielivaltaisen tarkkuuden lukuja. Sen syntaksissa on yhtalaisyyksia C-kielen syntaksin kanssa. Vakiomatematiikkakirjasto on saatavissa kayttoon komentorivioptiona. Matematiikkakirjasto maaritellaan talloin ennen tiedostojen kasittelya. bc kaynnistyy kasittelemalla kaikkien komentorivilla lueteltujen tiedostojen sisaltaman ohjelmakoodin siina jarjestyksessa kuin tiedostot on kutsuttu. Kun kaikki tiedostot on kasitelty, bc lukee vakiosyottoa. Kaikki ohjelmakoodi suoritetaan sita mukaa kuin se luetaan. (Jos tiedostossa on prosessorin pysayttava komento, bc ei koskaan lue vakiosyottoa.) Tama bc:n versio sisaltaa lukuisia laajennuksia verrattuina perinnaisiin bc toteutuksiin ja POSIX standardiluonnokseen. Komentorivioptiot voivat aikaansaada naita laajennuksia koskevan virheilmoituksen tai hylkayksen. Tama dokumentti kuvaa taman prosessorin hyvaksyman kielen. Laajennukset mainitaan erikseen. VALITSIMET -h, --help Print the usage and exit. -i, --interactive Force interactive mode. -l, --mathlib Maarittele vakiomatematiikkakirjasto. -w, --warn Varoita bc:n laajennuksista POSIXiin verrattuna. -s, --standard Kasittele POSIX bc kielen mukaisesti. -q, --quiet Ala tulosta normaalia GNU bc:n tervetuloilmoitusta. -v, --version Tulosta version numero ja copyright ja poistu. LUVUT The most basic element in bc is the number. Numbers are arbitrary precision numbers. This precision is both in the integer part and the fractional part. All numbers are represented internally in decimal and all computation is done in decimal. (This version truncates results from divide and multiply operations.) There are two attributes of numbers, the length and the scale. The length is the total number of decimal digits used by bc to represent a number and the scale is the total number of decimal digits after the decimal point. For example: luvun .000001 pituus on 6 ja skaalaus 6. luvun 1935.000 pituus on 7 ja skaalaus 3. MUUTTUJAT Luvut talletetaan kahdentyyppisiin muuttujiin, so. yksinkertaisiin muuttujiin ja saantioihin. Molemmille annetaan nimi. Nimet alkavat kirjaimella, jota seuraa mielivaltainen maara kirjaimia, numeroita ja alleviivoja. Kaikkien kirjainten tulee olla pienia kirjaimia. (Taydet alfanumeeriset nimet ovat laajennus. POSIX bc:ssa kaikki nimet ovat yksittaisia pienia kirjaimia.) Muuttujan tyyppi selviaa asiayhteydesta, koska kaikkia saantiomuuttujan nimia seuraavat hakasulut ([]). Kaytossa on nelja erikoismuuttujaa, scale, ibase, obase, ja last. scale maarittelee, miten jotkut operaatiot kayttavat numeroita desimaalipisteen jalkeen. scale:n oletusarvo on 0. ibase ja obase maarittelevat syotettavien ja tulostettavien lukujen kantaluvun. Seka syoton etta tulostuksen oletuskantaluku on 10. last (laajennus) on muuttuja, jolla on viimeksi tulostetun luvun arvo. Naita tarkastellaan myohemmin yksityiskohtaisemmin silloin kun on tarpeen. Kaikille naille muuttujille voidaan sijoittaa arvo ja niita voidaan kayttaa lausekkeissa. KOMMENTIT Kommentit bc-kielessa alkavat merkkiparilla /* ja paattyvat merkkipariin */. Kommentit voivat alkaa mista tahansa ja nakyvat syotossa valilyontina. (Taman seurauksena kommentit rajoittavat muita syottoalkioita. Esimerkiksi kommentti ei voi olla muuttujanimen keskella.) Kommentit sisaltavat kommentin alun ja lopun valiset rivinvaihdot. Skriptien kayton helpottamiseksi bc:ssa siihen on lisatty laajennuksena yhden rivin kommentti, joka alkaa merkilla # ja jatkuu seuraavaan rivinvaihtoon. Rivinvaihto ei ole kommentin osa ja se kasitellaan tavalliseen tapaan. LAUSEKKEET Lukuja kasitellaan lausekkeilla (expressions) ja lauseilla (statements). Kun kieli suunniteltiin vuorovaikutteiseksi, lausekkeet ja lauseet toteutetaan niin aikaisin kuin mahdollista. "Paaohjelmaa ei ole, vaan koodi suoritetaan silloin kun se tulee vastaan. (Funktiot, joita kasitellaan yksityiskohtaisesti jaljempana, maaritellaan kun ne tulevat vastaan.) A simple expression is just a constant. bc converts constants into internal decimal numbers using the current input base, specified by the variable ibase. (There is an exception in functions.) The legal values of ibase are 2 through 36. (Bases greater than 16 are an extension.) Assigning a value outside this range to ibase will result in a value of 2 or 36. Input numbers may contain the characters 0-9 and A-Z. (Note: They must be capitals. Lower case letters are variable names.) Single digit numbers always have the value of the digit regardless of the value of ibase. (i.e. A = 10.) For multi-digit numbers, bc changes all input digits greater or equal to ibase to the value of ibase-1. This makes the number ZZZ always be the largest 3 digit number of the input base. Taydelliset lausekkeet ovat samanlaisia kuin monissa muissa korkean tason kielissa. Kun lukuja on vain yhta lajia, ei lukutyyppien sekoitussaantoja tarvita. Niiden sijasta on kaytossa lausekkeiden skaalaussaannot. Jokaisella lausekkeella on skaalaus. Se johdetaan alkuperaisten lukujen skaalauksesta, suoritetusta operaatiosta ja useissa tapauksissa muuttujan scale arvosta. Muuttujan scale lailliset arvot ovat valilla 0 - C-kielen maksimikokonaisluku. Seuraavassa laillisten lausekkeiden kuvauksessa "expr" tarkoittaa taydellista lauseketta ja "var" yksinkertaista tai saantiomuuttujaa. Yksinkertainen muuttuja maaritellaan nimi ja saantiomuuttuja nimi[expr] Ellei erityisesti toisin mainita, tuloksen skaalaus on kaytettyjen lausekkeiden maksimiskaalaus. - expr Tulos on lausekkeen negaatio. ++ var Muuttujaa kasvatetaan yhdella ja uusi arvo on lausekkeen tulos. -- var Muuttujaa pienennetaan yhdella ja uusi arvo on lausekkeen tulos. var ++ Lausekkeen tulos on muuttujan arvo, minka jalkeen muuttujaa kasvatetaan yhdella. var -- Lausekkeen tulos on muuttujan arvo, minka jalkeen muuttujaa pienennetaan yhdella. expr + expr Lausekkeen tulos on kahden lausekkeen summa. expr - expr Lausekkeen tulos on kahden lausekkeen erotus. expr * expr Lausekkeen tulos on kahden lausekkeen tulo. expr / expr Lausekkeen tulos on kahden lausekkeen osamaara. Tuloksen skaalaus on muuttujan scale arvo. expr % expr Lausekkeen tulos on "jakojaannos" joka lasketaan seuraavalla tavalla. a%b:n laskemiseksi lasketaan ensin a/b scale numeron tarkkuudella. Tulosta kaytetaan laskettaessa a-(a/b)*b skaalauksella, joka on scale+scale(b):n ja scale(a):n maksimiarvo. Jos scale:lle annetaan arvo nolla ja molemmat lausekkeet ovat kokonaislukuja, tama lauseke on kokonaislukujen jakojaannosfunktio. expr ^ expr Tulos on ensimmaisen lausekkeen arvo korotettuna toisen lausekkeen ilmoittamaan potenssiin. Toisen lausekkeen taytyy olla kokonaisluku. (Jos toinen lauseke ei ole kokonaisluku, annetaan varoitus ja lauseke typistetaan niin, etta siita tulee kokonaisluku.) Tuloksen skaalaus on scale jos eksponentti on negatiivinen. Jos eksponentti on positiivinen, tuloksen skaalaus on tuloksen skaalaus minimi ensimmaisen lausekkeen skaalauksesta kertaa eksponentin arvo ja scale:n ja ensimmaisen lausekkeen skaalauksen maksimista. (esim. scale(a^b) = min(scale(a)*b, max( scale, scale(a))).) Huomattakoon, etta expr^0 palauttaa aina arvon 1. ( expr ) Muuttaa laskentajarjestyksen ja antaa lausekkeen tuloksen. var = expr Muuttujaan asetetaan lausekkeen arvo. var = expr Yhta kuin "var = var expr" silla poikkeuksella, etta "var" osan arvo lasketaan vain kerran. Talla on merkitysta, jos "var" on saantio. Vertailulausekkeet ovat erityislausekkeita, jotka antavat aina tulokseksi 0 tai 1, 0 jos vertailu on epatosi ja 1 jos se on tosi. Ne voivat esiintya kaikissa laillisissa lausekkeissa. (POSIX bc sallii vertailulausekkeiden kayton vain if, while ja for lauseissa ja vain yhden vertailutestin tekemisen.) Vertailuoperaattorit ovat expr1 < expr2 Tulos on 1 jos expr1 on pienempi kuin expr2. expr1 <= expr2 Tulos on 1 jos expr1 on pienempi tai yhtasuuri kuin expr2. expr1 > expr2 Tulos on 1 jos expr1 on suurempi kuin expr2. expr1 >= expr2 Tulos on 1 jos expr1 on suurempi tai yhtasuuri kuin expr2. expr1 == expr2 Tulos on 1 jos expr1 on yhtasuuri kuin expr2. expr1 != expr2 Tulos on 1 jos expr1 on erisuuri kuin expr2. Boolen operaatiot ovat myos laillisia. (POSIX bc EI tunne boolen operaatioita). Kaikkien boolen operaatioiden tulos on 0 tai 1 (vast. epatosi ja tosi) kuten vertailulausekkeissa. Boolen operaattorit ovat: !expr Tulos on 1 jos expr on 0. expr && expr Tulos on 1 jos molemmat lausekkeet poikkeavat nollasta. expr || expr Tulos on 1 jos jompikumpi lauseke poikkeaa nollasta. Lausekkeen laskentajarjestys on seuraava: (alimmasta ylimpaan) || operaattori, vasemmalle assosiatiivinen && operaattori, vasemmalle assosiatiivinen ! operaattori, ei-assosiatiivinen Vertailuoperaattorit, vasemmalle assosiatiivisia Sijoitusoperaattori, oikealle assosiatiivinen + ja - operaattorit, vasemmalle assosiatiivisia *, / ja % operaattorit, vasemmalle assosiatiivisia ^ operaattori, oikealle assosiatiivinen unaari - operaattori, ei-assosiatiivinen ++ ja -- operaattorit, ei-assosiatiivisia Laskentajarjestys on valittu niin, etta POSIX yhteensopivat bc ohjelmat toimivat oikein. Taman seurauksena vertailu- ja loogiset operaattorit kayttaytyvat epatavallisesti sijoituslauseissa. Tarkastellaan lauseketta a = 3 < 5 Useimmat C-ohjelmoijat olettaisivat, etta tassa sijoitettaisiin lausekkeen "3 < 5" tulos (arvo 1) muuttujaan "a". Se mita bc tekee on arvon 3 sijoitus muuttujaan "a" ja sitten vertailu 3 ja 5 valilla. On paras kayttaa sulkuja, jos kayttaa vertailu- ja loogisia operaattoreita yhdessa sijoitusoperaattorin kanssa. bc:ssa on lisaksi muutamia muita erikoisoperaattoreita, joita kaytetaan kayttajan maarittelemien funktioiden ja vakiofunktioiden kanssa. Niiden ulkonako on "name(parameters)". Katso kayttajan funktioita koskevaa lukua. Vakiofunktiot ovat: length ( expression ) length (pituus) funktion arvo on lausekkeen merkitsevien numeroiden lukumaara. read ( ) read funktio (laajennus) lukee luvun vakiosyotosta riippumatta siita, missa funktio kohdataan. Tama voi aiheuttaa pulmia vakiosyotosta tulevien tietojen ja ohjelman sekoittuessa. Paras tapa kayttaa tata funktiota on kayttaa sita valmiissa ohjelmassa lukemaan kayttajan syottamaa tietoa, mutta ei koskaan sallia ohjelmakoodin syottamista sille. read-funktion arvo on luku, joka luetaan vakiosyotosta kayttamalla ibase:n kaypaa arvoa konversiokantalukuna. scale ( expression ) scale funktion arvo on lausekkeen desimaalipisteen jalkeisten numeroiden lukumaara. sqrt ( expression ) sqrt (neliojuuri) funktion arvo on lausekkeen neliojuuri. Jos lauseke on negatiivinen, tuloksena on ajoaikainen virhe. LAUSEET Kuten useimmissa algebrallisissa kielissa, myos bc:ssa lauseet jonouttavat lausekkeiden arvojen laskennan. bc:ssa lauseet suoritetaan "niin pian kuin mahdollista". Suoritus tapahtuu, kun koodissa tulee vastaan rivinvaihto ja yksi tai useampia valmiita lauseita on olemassa. Taman valittoman suorituksen takia rivinvaihdot ovat hyvin tarkeita bc-kielessa. Seka puolipistetta etta rivinvaihtoa kaytetaan lauseenerottimina. Vaaraan paikkaan sijoitettu rivinvaihto aiheuttaa syntaksivirheen. Koska rivinvaihdot ovat lauseenerottimia, on mahdollista katkea rivinvaihto kayttamalla kenoviivamerkkia. Merkkijono "\", jossa on rivinvaihto, nakyy bc:lle valilyontina eika rivinvaihtona. Lauselista (a statement list) on puolipisteiden ja rivinvaihtojen erottama sarja lauseita. Seuraavassa on lista bc-lauseita ja kuvaukset siita, mita ne tekevat: (Hakasulkuihin suljetut osat ([]) ovat lauseen valinnaisia osia.) expression Tama lause tekee jomman kumman kahdesta asiasta. Jos lauseke alkaa " ...", se on sijoituslause. Jos lauseke ei ole sijoituslause, sen arvo lasketaan ja tulostetaan. Kun luku on tulostettu, tulostetaan rivinvaihto. Esimerkiksi "a=1" on sijoituslause ja "(a=1)" on lauseke, jossa on upotettu sijoitus. Kaikki tulostettavat luvut tulostetaan kayttaen kantalukuna muuttujan obase maarittelemaa kantalukua. Muuttujan obase lailliset arvot ovat valilla 2 - BC_BASE_MAX. (Katso kappaletta RAJAT.) Kantaluvuilla 2 - 16 kirjoitetaan tavalliseen tapaan numeroita. Jos kantaluku on suurempi kuin 16, bc kayttaa monimerkkista tulostusmenetelmaa, jossa 16 suuremmat kantaluvut kirjoitetaan kymmenkantaisina lukuina, jotka erotetaan toisistaan valilyonnein. Kukin tallainen "numero" sisaltaa niin monta merkkia kuin tarvitaan esittamaan "obase-1" kymmenkantaisena lukuna. Kun luvut ovat tarkkuudeltaan mielivaltaisen suuria, joitakin niista ei voida tulostaa yhdelle riville. Nama pitkat luvut jaetaan usealle riville kayttamalla merkkia "\" rivin viimeisena merkkina. Riville voidaan tulostaa enintaan 70 merkkia. bc:n vuorovaikutteisesta tulostustavasta seuraa sivuvaikutuksena tulostetun arvon sijoitus erityismuuttujaan last. Tama tekee kayttajalle mahdolliseksi ottaa talteen viimeksi tulostettu arvo tarvitsematta kirjoittaa uudelleen lauseketta, joka tulosti luvun. Sijoitus muuttujaan last on laillinen ja korvaa viimeksi tulostetun arvon sijoitetulla arvolla. Sijoitettu arvo sailyy kunnes uusi luku tulostetaan tai uusi arvo sijoitetaan muuttujaan last. (Jotkut installaatiot voivat hyvaksya yhden pisteen (.) kayton "pikakirjoitusmerkkina muuttujanimen last sijasta.) string Merkkijono ("string") kirjoitetaan tulostukseen. Merkkijonot alkavat kaksoislainausmerkilla ja sisaltavat kaikki merkit seuraavaan kaksoislainausmerkkiin asti. Kaikki merkit otetaan sellaisinaan, myos rivinvaihdot. Rivinvaihtomerkkia ei tulosteta merkkijonon jalkeen. print list print-lause (laajennus) on tulostusmenetelma. "list" on pilkuilla erotettu merkkijonojen ja lausekkeiden lista. Kukin merkkijono tai lauseke tulostetaan listan mukaisessa jarjestyksessa. Loppuun ei tulosteta rivinvaihtomerkkia. Lausekkeiden arvot lasketaan, tulostetaan ja sijoitetaan muuttujaan last. print-lauseen merkkijonot tulostetaan. Niissa voi olla erikoismerkkeja. Erikoismerkit alkavat kenoviivalla (\). bc tuntee seuraavat erikoismerkit: "a" (alert or bell), "b" (backspace), "f" (form feed), "n" (newline), "r" (carriage return), "q" (double quote), "t" (tab), and "\" (backslash). Muita kenoviivan jalkeisia merkkeja ei oeta huomioon. { lause_lista } Tama on yhdistelmalause. Se sallii useiden lauseiden yhteenryhmityksen suoritusta varten. if ( lauseke ) lause1 [else lause2] if-lause laskee lausekkeen arvon ja suorittaa joko lauseen lause1 tai lauseen lause2 lausekkeen arvosta riippuen. Jos lauseke poikkeaa nollasta, suoritetaan lause1. Jos lause2 on olemassa ja lausekkeen arvo on 0, lause2 suoritetaan. (else-lause on laajennus.) while ( lauseke ) lause while-lause suorittaa lauseen, jos lauseke poikkeaa nollasta. Se laskee lausekkeen arvon ennen lauseen jokaista suoritusta. Silmukasta poistutaan, kun lauseke saa arvon 0 tai silmukan sisalla suoritetaan break-lause. for ( [lauseke1] ; [lauseke2] ; [lauseke3] ) lause for-lause valvoo lauseen toistuvaa suoritusta. Lausekkeen lauseke1 arvo lasketaan ennen silmukkaa. Lausekkeen lauseke2 arvo lasketaan ennen lauseen jokaista suoritusta. Jos se poikkeaa nollasta, lause suoritetaan. Lauseen jokaisen suorituksen jalkeen lasketaan lausekkeen lauseke3 arvo ennen kuin lausekkeen lauseke2 arvo lasketaan uudestaan. Jos lauseke1 tai lauseke3 puuttuvat, mitaan ei lasketa siina kohdassa, jossa niiden arvot tulisi laskea. Jos lauseke2 puuttuu, vaikutus on sama kuin arvo 1 olisi lausekkeen lauseke2 tilalla. (Valinnaiset lausekkeet on laajennus. POSIX bc vaatii kaikki kolme lauseketta.) Seuraava koodi on samanarvoinen for-lauseen kanssa: lauseke1; while (lauseke2) { lause; lauseke3; } break Tama lause aiheuttaa pakollisen poistumisen viimeksi aloitetusta while- tai for-lauseesta. continue continue-lause (laajennus) aikaansaa viimeksi aloitetun for-lauseen aloittamaan seuraavan iteraation. halt halt-lause (laajennus) on suoritettava lause, joka lopettaa bc prosessorin toiminnan vain silloin, kun se suoritetaan. Lauseke "if (0 == 1) halt" ei lopeta bc:n toimintaa, koska halt-lausetta ei suoriteta. return Palauttaa arvon 0 funktiosta. (Katso lukua funktioista.) return ( lauseke ) Return the value of the expression from a function. (See the section on functions.) As an extension, the parenthesis are not required. VALELAUSEET Nama lauseet eivat ole lauseita vakiintuneessa mielessa. Ne eivat ole suoritettavia lauseita, vaan ne toteutetaan "kaannosaikana". limits Tulostaa bc:n paikallisen toteutuksen mukaiset rajat. Tama on laajennus. quit Kun quit-lause luetaan, bc-prosessori lopettaa toimintansa riippumatta siita, missa quit-lause loytyy. Esimerkiksi "if (0 == 1) quit" aikaansaa bc:n lopetuksen. warranty Tulostaa pitkahkon vastuuhuomautuksen (laajennus). FUNKTIOT Funktiot tarjoavat keinon maaritella laskutoimitus myohempaa suoritusta varten. bc :n funktiot laskevat aina arvon ja palauttavat sen kutsuvalle ohjelmalle. Funktiomaaritykset ovat "dynaamisia" siina mielessa etta funktio on maarittelematon kunnes maarittely tulee vastaan syotossa. Tata maarittelya kaytetaan, kunnes toinen samanniminen maarittely tulee vastaan. Talloin uusi maarittely korvaa vanhemman. Funktio maaritellaan seuraavasti: define nimi ( parametrit ) { rivinvaihto auto_lista lause_lista } Funktiokutsu on seuraavan muotoinen lauseke: "nimi(parametrit)". Parameters are numbers or arrays (an extension). In the function definition, zero or more parameters are defined by listing their names separated by commas. All parameters are call by value parameters. Arrays are specified in the parameter definition by the notation "name[]". In the function call, actual parameters are full expressions for number parameters. The same notation is used for passing arrays as for defining array parameters. The named array is passed by value to the function. Since function definitions are dynamic, parameter numbers and types are checked when a function is called. Any mismatch in number or types of parameters will cause a runtime error. A runtime error will also occur for the call to an undefined function. The auto_list is an optional list of variables that are for "local" use. The syntax of the auto list (if present) is "auto name, ... ;". (The semicolon is optional.) Each name is the name of an auto variable. Arrays may be specified by using the same notation as used in parameters. These variables have their values pushed onto a stack at the start of the function. The variables are then initialized to zero and used throughout the execution of the function. At function exit, these variables are popped so that the original value (at the time of the function call) of these variables are restored. The parameters are really auto variables that are initialized to a value provided in the function call. Auto variables are different than traditional local variables because if function A calls function B, B may access function A's auto variables by just using the same name, unless function B has called them auto variables. Due to the fact that auto variables and parameters are pushed onto a stack, bc supports recursive functions. Funktion runko on lista bc-lauseita. Tassakin lauseet erotetaan toisistaan puolipistein tai rivinvaihdoin. Return-lauseet aikaansaavat funktion paattymisen ja arvon palautuksen. Return-lauseita on kahta versiota. Naista ensimmainen, "return", palauttaa arvon 0 kutsuneelle funktiolle. Toinen muoto, "return ( lauseke )", laskee lausekkeen arvon ja palauttaa sen kutsuneelle funktiolle. Jokaisen funktion lopussa on oletettu "return (0)", joka lopettaa funktion suorituksen ja palauttaa arvon 0 ilman eksplisiittista return-lausetta. Funktiot muuttavat myos muuttujan ibase kayttotapaa. Kaikki funktiorungon vakiot konvertoidaan kayttaen funktiokutsun aikaista muuttujan ibase arvoa.Muuttujan ibase arvon muutoksia ei oteta huomioon funktion suorituksen aikana lukuunottamatta standardifunktiota read, joka kayttaa aina ibase:n kaypaa arvoa lukujen konversioon. Several extensions have been added to functions. First, the format of the definition has been slightly relaxed. The standard requires the opening brace be on the same line as the define keyword and all other parts must be on following lines. This version of bc will allow any number of newlines before and after the opening brace of the function. For example, the following definitions are legal. define d (n) { return (2*n); } define d (n) { return (2*n); } Functions may be defined as void. A void funtion returns no value and thus may not be used in any place that needs a value. A void function does not produce any output when called by itself on an input line. The key word void is placed between the key word define and the function name. For example, consider the following session. define py (y) { print "--->", y, "<---", "\n"; } define void px (x) { print "--->", x, "<---", "\n"; } py(1) --->1<--- 0 px(1) --->1<--- Since py is not a void function, the call of py(1) prints the desired output and then prints a second line that is the value of the function. Since the value of a function that is not given an explicit return statement is zero, the zero is printed. For px(1), no zero is printed because the function is a void function. Also, call by variable for arrays was added. To declare a call by variable array, the declaration of the array parameter in the function definition looks like "*name[]". The call to the function remains the same as call by value arrays. MATEMAATTINEN KIRJASTO Jos bc kutsutaan -l optiota kayttaen, matemaattinen kirjasto ladataan ja oletusskaalaukselle annetaan arvo 20. Matemaattiset funktiot laskevat tuloksensa kayttaen niiden kutsumisen aikaista skaalausarvoa. Matemaattisessa kirjastossa on seuraavat funktiot: s (x) Sini x:sta, x radiaaneina. c (x) Kosini x:sta, x radiaaneina. a (x) Arcustangentti x:sta, palauttaa tuloksen radiaaneina. l (x) Luonnollinen logaritmi x:sta. e (x) Exponenttifunktio, jossa e korotetaan potenssiin x. j (n,x) Kokonaislukukertalukua n oleva Bessel-funktio x:sta. ESIMERKKEJA Kaytettaessa komentotulkkia /bin/sh, seuraava sijoittaa "pi" arvon komentotulkkimuuttujaan pi. pi=$(echo "scale=10; 4*a(1)" | bc -l) Seuraava on matemaattisen kirjaston eksponenttifunktion maarittely. Se on kirjoitettu kayttaen POSIX bc. scale = 20 /* Uses the fact that e^x = (e^(x/2))^2 When x is small enough, we use the series: e^x = 1 + x + x^2/2! + x^3/3! + ... */ define e(x) { auto a, d, e, f, i, m, v, z /* Check the sign of x. */ if (x<0) { m = 1 x = -x } /* Precondition x. */ z = scale; scale = 4 + z + .44*x; while (x > 1) { f += 1; x /= 2; } /* Initialize the variables. */ 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 } } Seuraava koodi kayttaa bc:n laajennuksia yksinkertaisen shekkitilisaldo-ohjelman toteuttamiseen. Ohjelma on paras pitaa tiedostossa niin, etta sita ei aina tarvitse kirjoittaa uudelleen. scale=2 print "\nCheck book program!\n" print " Remember, deposits are negative transactions.\n" print " Exit by a 0 transaction.\n\n" print "Initial balance? "; bal = read() bal /= 1 print "\n" while (1) { "current balance = "; bal "transaction? "; trans = read() if (trans == 0) break; bal -= trans bal /= 1 } quit Seuraava on rekursiivisen factoriaali-funktion maaritelma. define f (x) { if (x <= 1) return (1); return (f(x-1) * x); } READLINE AND LIBEDIT OPTIONS GNU bc can be compiled (via a configure option) to use the GNU readline input editor library or the BSD libedit library. This allows the user to do editing of lines before sending them to bc. It also allows for a history of previous lines typed. When this option is selected, bc has one more special variable. This special variable, history is the number of lines of history retained. For readline, a value of -1 means that an unlimited number of history lines are retained. Setting the value of history to a positive number restricts the number of history lines to the number given. The value of 0 disables the history feature. The default value is 100. For more information, read the user manuals for the GNU readline, history and BSD libedit libraries. One can not enable both readline and libedit at the same time. EROAVUUDET Tama bc :n versio on toteutettu POSIX P1003.2/D11 luonnoksesta ja sisaltaa useita eroavuuksia ja laajennuksia verrattuna luonnokseen ja perinnaisiin toteutuksiin. Sita ei ole toteutettu perinnaiseen tapaan kayttamalla ohjelmaa dc(1). Tama versio on yksi prosessi, joka tulkitsee (parses) ja ajaa ohjelman tavukoodikaannoksen (byte code translation). On olemassa "dokumentoimaton" optio (-c) joka saa ohjelman tulostamaan tavukoodin sen toteuttamisen sijasta. Sita kaytettiin paaasiassa debuggaamiseen ja matemaattisen kirjaston valmistamiseen. Paaasiallinen eroavuuksien lahde ovat laajennukset, joissa jotakin ominaisuutta on laajennettu toimivuuden parantamiseksi, ja lisaykset, joissa uusia ominaisuuksia on lisatty. Seuraava on eroavuuksien ja laajennusten luettelo. LANG environment Tama versio ei ole POSIX standardin mukainen kasitellessaan LANG ymparistomuuttujaa ja kaikkia LC_ alkuisia ymparistomuuttujia. nimet Traditionaalinen ja POSIX bc kayttavat yhden kirjaimen nimia funktioilla, muuttujilla ja saantioilla. Nama nimet on laajennettu monimerkkisiksi nimiksi, jotka alkavat kirjaimella ja voivat sisaltaa kirjaimia, numeroita ja alleviivamerkkeja. Merkkijonot Merkkijonoissa ei saa olla NUL-merkkeja. POSIX sallii kaikkien merkkien kayton merkkijonoissa. last POSIX bc:ssa ei ole last muuttujaa. Jotkut bc toteutukset kayttavat pistetta (.) samaan tapaan. vertailut POSIX bc sallii vertailut vain if-lauseessa, while-lauseessa ja for-lauseen toisessa lausekkeessa. Lisaksi vain yksi vertailuoperaatio on sallittu jokaisessa naista lauseista. if-lause, else-lause POSIX bc:ssa ei ole else-lausetta. for-lause POSIX bc vaatia kaikkien lausekkeiden olemassaolon for-lauseessa. &&, ||, ! POSIX bc:ssa ei ole loogisia operaattoreita. read funktio POSIX bc:ssa ei ole read funktiota. print-lause POSIX bc:ssa ei ole print-lausetta. continue-lause POSIX bc:ssa ei ole continue-lausetta. return statement POSIX bc requires parentheses around the return expression. saantioparametrit POSIX bc ei (toistaiseksi) taysin tue saantioparametreja. POSIX kielioppi hyvaksyy saantiot funktion maarityksessa, mutta ei tarjoa menetelmaa saantion maarittelemiseksi todellisena parametrina. (Tassa on todennakoisimmin kysymys kieliopin laatijan huomaamattomuudesta.) bc:n perinnaisissa toteutuksissa on kaytossa vain saantioparametrien arvoina kutsuminen. function format POSIX bc requires the opening brace on the same line as the define key word and the auto statement on the next line. =+, =-, =*, =/, =%, =^ POSIX bc ei edellyta naiden "vanhantyylisten" sijoitusoperaattorien maarittelya. Tama versio sallii nama "vanhantyyliset" sijoitukset. Kayta limits-lausetta nahdaksesi, tukeeko installoitu versio niita. Jos se ei tue "vanhantyylisia" sijoitusoperaattoreita, lause "a =- 1" vahentaa a:n arvoa yhdella sen sijaan, etta se sijoittaisi siihen arvon -1. valilyonnit luvun sisalla Muut bc:n toteutukset sallivat valilyonteja luvun sisalla. Siten lause "x=1 3" sijoittaisi arvon 13 muuttujaan x. Sama lause aiheuttaisi syntaksivirheen tassa versiossa. Virheet ja ohjelman suoritus Tama toteutus poikkeaa muista toteutuksista siina, miten koodi suoritetaan kun syntaksi- ja muita virheita loytyy ohjelmasta. Jos syntaksivirhe loytyy funktion maarittelysta, virheesta toipumisrutiini yrittaa loytaa lauseen alun ja jatkaa funktion tulkintaa. Kun funktiosta loytyy syntaksivirhe, funktiota ei voi kutsua ja siita tulee maarittelematon. Vuorovaikutteisen suoritettavan koodin syntaksivirheet tekevat suorituksen alaisesta lohkosta epavalidin. Suoritettava lohko lopetetaan sen rivin lopussa, joka seuraa taydellista lausejonoa. Esimerkiksi a = 1 b = 2 on kaksi suoritettavaa lohkoa ja { a = 1 b = 2 } on yksi suoritettava lohko. Ajoaikainen virhe lopettaa suorituksen alaisen lohkon suorituksen. Ajoaikainen varoitus ei lopeta suorituksen alaisen lohkon suoritusta. Keskeytykset Vuorovaikutteisen istunnon aikana SIGINT signaali (jonka tavallisesti kehittaa paatteelta annettu control-C merkki) keskeyttaa suorituksen alaisen lohkon suorituksen. Se nayttaa "ajoaikaisen" virheen, joka osoittaa etta funktio keskeytettiin. Kun kaikki ajoaikaiset rakenteet on siivottu, tulostetaan ilmoitus kayttajalle siita, etta bc on valmis ottamaan vastaan tietoa. Kaikki aikaisemmin maaritellyt funktiot sailyvat maariteltyina ja kaikkien ei-automaattisten muuttujien arvot ovat keskeytyskohdan arvoja. Kaikki automaattiset muuttujat ja funktioiden parametrit poistuvat siivousprosessissa. Ei-interaktiivisen istunnon aikana annettu SIGINT signaali lopettaa koko bc-ajon. RAJAT Tama bc prosessori kayttaa nykyisin seuraavia raja-arvoja. Joitakin niista on ehka muutettu installoinnin yhteydessa. Kayta limits-lausetta nahdaksesi todelliset arvot. BC_BASE_MAX Tulostuskantaluvun maksimiarvo on nykyisin asetettu arvoon 999. Syottokantaluvun maksimiarvo on 16. BC_DIM_MAX Nykyisissa jakeluversioissa kaytetaan mielivaltaista arvoa 65535. Sinun installaatiosi arvo voi olla toinen. BC_SCALE_MAX Desimaalipisteen jalkeisten numeroiden lukumaara on rajoitettu INT_MAX numeroon. Myos ennen desimaalipistetta olevien numeroiden maara on rajoitettu INT_MAX numeroon. BC_STRING_MAX Merkkijonon merkkien lukumaara on rajoitettu INT_MAX merkkiin. eksponentti Eksponentin arvo potenssiinkorotusoperaatiossa (^) on rajoitettu arvoon LONG_MAX. muuttujanimet Nykyinen raja yksikasitteisten nimien lukumaaralle on 32767 seka yksinkertaisille muuttujille, saantioille etta funktioille. YMPARISTOMUUTTUJAT bc kasittelee seuraavia ymparistomuuttujia: POSIXLY_CORRECT Sama kuin -s optio. BC_ENV_ARGS Mekanismi, jolla saadaan argumentteja bc-ohjelmalle. Muoto on sama kuin komentoriviargumenteilla. Nama argumentit prosessoidaan ensin, niin etta ymparistomuuttujissa luetellut tiedostot prosessoidaan ennen komentorivilla annettuja tiedostoja. Kayttaja voi siten asettaa "standardioptioita ja -tiedostoja" jotka prosessoidaan aina ohjelmaa bc kutsuttaessa. Ymparistomuuttujissa annetut tiedostot sisaltavat tavallisesti niiden funktioiden maaritykset, jotka kayttaja haluaa maaritella joka kerta kun bc ajetaan. BC_LINE_LENGTH This should be an integer specifying the number of characters in an output line for numbers. This includes the backslash and newline characters for long numbers. As an extension, the value of zero disables the multi-line feature. Any other value of this variable that is less than 3 sets the line length to 70. VIRHEILMOITUSTEN TULKINTA Jos komentorivilla mainittua tiedostoa ei voi avata, bc ilmoittaa tiedosto ei ole kaytettavissa ja lopettaa suorituksen. Kaannos- ja ajoaikaiset diagnostiset ilmoitukset ovat itseselitteisia. BUGIT Virheista toipuminen ei viela ole kovin hyva. Postita bugiraportit (englanniksi) osoitteeseen bug-bc@gnu.org. Muista lisata sana "bc" kenttaan "Subject:". TEKIJA Philip A. Nelson philnelson@acm.org KIITOKSET Tekija haluaa kiittaa Steve Sommars'ia (Steve.Sommars@att.com) laajasta sovelluksen toteutuksen testausavusta ja monista erinomaisista parannusehdotuksista. Hanen ansiostaan tuote on paljon parantunut. KAANNOS Taman kasikirjan suomenkielisen kaannoksen tekivat Tuukka Forssell Tama kaannos on ilmainen dokumentaatio; katso tekijanoikeusehdot GNU General Public License -versiosta 3 tai uudemmasta. Emme ota vastuuta. GNU Project 11. kesakuuta 2006 bc(1)