bc

bc(1)                      Käyttäjän sovellusohjelmat                      bc(1)



NIMI
       bc - Mielivaltaisen tarkkuuden laskentakieli

SYNTAKSI
       bc [ -lwsqv ] [pitkät_optiot] [  tiedosto ... ]

VERSIO
       Tämä käsikirjan sivu dokumentoi GNU bc:n version 1.04.

KUVAUS
       bc on kieli, jolla voidaan toteuttaa vuorovaikutteisesti lauseita, joissa
       käytetään mielivaltaisen tarkkuuden lukuja. Sen syntaksissa on
       yhtäläisyyksiä C-kielen syntaksin kanssa. Vakiomatematiikkakirjasto on
       saatavissa käyttöön komentorivioptiona. Matematiikkakirjasto määritellään
       tällöin ennen tiedostojen käsittelyä.  bc käynnistyy käsittelemällä
       kaikkien komentorivillä lueteltujen tiedostojen sisältämän ohjelmakoodin
       siinä järjestyksessä, kuin tiedostoja on kutsuttu. Kun kaikki tiedostot
       on käsitelty, bc lukee vakiosyötettä.  Kaikki ohjelmakoodi suoritetaan
       sitä mukaa, kuin se luetaan. (Jos tiedostossa on prosessorin pysäyttävä
       komento, bc ei koskaan lue vakiosyötettä.)

       Tämä bc:n versio sisältää lukuisia laajennuksia verrattuina perinteisiin
       bc-toteutuksiin ja POSIX-standardiluonnokseen.  Komentorivioptiot voivat
       aikaansaada näitä laajennuksia koskevan virheilmoituksen tai hylkäyksen.
       Tämä dokumentti kuvaa tämän prosessorin hyväksymän kielen. Laajennukset
       mainitaan erikseen.

   OPTIOT
       -l     Määrittele vakiomatematiikkakirjasto.

       -w     Varoita bc:n laajennuksista POSIXiin verrattuna.

       -s     Käsittele POSIX bc -kielen mukaisesti.

       -q     Älä tulosta normaalia GNU bc:n tervetuloilmoitusta.

       -v     Tulosta version numero ja copyright ja poistu.

       --mathlib
              Määrittele vakiomatematiikkakirjasto.

       --warn Varoita bc:n laajennuksista POSIXiin verrattuna.

       --standard
              Käsittele POSIX bc -kielen mukaisesti.

       --quiet
              Älä tulosta normaalia GNU bc:n tervetuloilmoitusta.

       --version
              Tulosta version numero ja copyright ja poistu.

   LUVUT
       bc:n perusalkio on luku. Luvut ovat mielivaltaisen tarkkuuden lukuja.
       Tarkkuus esitetään kokonaislukuosana ja murto-osana. Kaikki luvut
       esitetään sisäisesti desimaalilukuina ja kaikki laskenta tapahtuu
       kymmenjärjestelmässä.  (Tämä versio typistää jakolasku- ja
       kertolaskuoperaatioiden tulokset.)  Luvuilla on kaksi attribuuttia,
       pituus ja skaalaus. Pituus on luvun merkitsevien desimaalinumeroiden
       kokonaismäärä ja skaalaus on luvun desimaalipisteen jäljessä olevien
       desimaalinumeroiden kokonaismäärä. Esimerkiksi:
               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 taulukoihin. Molemmille annetaan nimi. Nimet alkavat
       kirjaimella, jota seuraa mielivaltainen määrä kirjaimia, numeroita ja
       alleviivoja. Kaikkien kirjainten tulee olla pieniä kirjaimia. (Täydet
       alfanumeeriset nimet ovat laajennus. POSIX bc:ssä kaikki nimet ovat
       yksittäisiä pieniä kirjaimia.) Muuttujan tyyppi selviää asiayhteydestä,
       koska kaikkia taulukkomuuttujan nimiä seuraavat hakasulut ([]).

       Käytössä on neljä erikoismuuttujaa, scale, ibase, obase ja last.  scale
       määrittelee, miten jotkut operaatiot käyttävät numeroita desimaalipisteen
       jälkeen.  scale:n oletusarvo on 0. ibase ja obase määrittelevät
       syötettävien ja tulostettavien lukujen kantaluvun. Sekä syötön että
       tulostuksen oletuskantaluku on 10.  last (laajennus) on muuttuja, jolla
       on viimeksi tulostetun luvun arvo. Näitä tarkastellaan myöhemmin
       yksityiskohtaisemmin silloin, kun se on tarpeen. Kaikille näille
       muuttujille voidaan sijoittaa arvo ja niitä voidaan käyttää lausekkeissa.

   KOMMENTIT
       Kommentit bc-kielessä alkavat merkkiparilla /* ja päättyvät merkkipariin
       */. Kommentit voivat alkaa mistä tahansa ja näkyvät syötössä
       välilyöntinä. (Tämän seurauksena kommentit rajoittavat muita
       syöttöalkioita. Esimerkiksi kommentti ei voi olla muuttujanimen
       keskellä.) Kommentit sisältävät kommentin alun ja lopun väliset
       rivinvaihdot.

       Skriptien käytön helpottamiseksi bc:ssä siihen on lisätty laajennuksena
       yhden rivin kommentti, joka alkaa merkillä # ja jatkuu seuraavaan
       rivinvaihtoon. Rivinvaihto ei ole kommentin osa ja se käsitellään
       tavalliseen tapaan.

   LAUSEKKEET
       Lukuja käsitellään lausekkeilla (expressions) ja lauseilla (statements).
       Koska kieli suunniteltiin vuorovaikutteiseksi, lausekkeet ja lauseet
       toteutetaan niin aikaisin kuin mahdollista. "Pääohjelmaa" ei ole, vaan
       koodi suoritetaan silloin, kun se tulee vastaan. (Funktiot, joita
       käsitellään yksityiskohtaisesti jäljempänä, määritellään, kun ne tulevat
       vastaan.)

       Yksinkertainen lauseke on vakio. bc muuntaa vakiot sisäisiksi
       desimaaliluvuiksi käyttäen voimassa olevaa syöttökantalukua, joka
       määritellään muuttujalla ibase. (Funktioissa on tätä koskeva poikkeus.)
       ibase:n lailliset arvot ovat 2 - 16. Tämän välin ulkopuolisen arvon
       sijoitus muuttujaan ibase antaa tulokseksi arvon 2 tai 16. Syötettävät
       luvut voivat sisältää merkkejä 0-9 ja A-F.  (Huom. On käytettävä isoja
       kirjaimia. Pienet kirjaimet ovat muuttujanimiä.)  Yksimerkkisillä
       luvuilla on aina merkin arvo riippumatta muuttujan ibase arvosta. (so. A
       = 10.)  Monimerkkisissä luvuissa bc muuttaa kaikki syötetyt ibase:a
       suuremmat merkit arvoon ibase-1.  Siten luku FFF on aina suurin
       kolminumeroinen luku.

       Täydelliset lausekkeet ovat samanlaisia kuin monissa muissa korkean tason
       kielissä. Kun lukuja on vain yhtä lajia, ei lukutyyppien sekoitussääntöjä
       tarvita. Niiden sijasta on käytössä lausekkeiden skaalaussäännöt.
       Jokaisella lausekkeella on skaalaus. Se johdetaan alkuperäisten lukujen
       skaalauksesta, suoritetusta operaatiosta ja useissa tapauksissa muuttujan
       scale-arvosta. Muuttujan scale lailliset arvot ovat välillä 0 - C-kielen
       maksimikokonaisluku.

       Seuraavassa laillisten lausekkeiden kuvauksessa "expr" tarkoittaa
       täydellistä lauseketta ja "var" yksinkertaista tai taulukkomuuttujaa.
       Yksinkertainen muuttuja määritellään:
              nimi
       ja taulukkomuuttuja:
              nimi[lauseke]
       Ellei erityisesti toisin mainita, tuloksen skaalaus on käytettyjen
       lausekkeiden maksimiskaalaus.

       - lauseke
              Tulos on lausekkeen negaatio.

       ++ var Muuttujaa kasvatetaan yhdellä ja uusi arvo on lausekkeen tulos.

       -- var Muuttujaa pienennetään yhdellä ja uusi arvo on lausekkeen tulos.

       var ++ Lausekkeen tulos on muuttujan arvo, minkä jälkeen muuttujaa
              kasvatetaan yhdellä.

       var -- Lausekkeen tulos on muuttujan arvo, minkä jälkeen muuttujaa
              pienennetään yhdellä.

       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 osamäärä.  Tuloksen skaalaus
              on muuttujan scale-arvo.

       expr % expr
              Lausekkeen tulos on "jakojäännös", joka lasketaan seuraavalla
              tavalla.  a%b:n laskemiseksi lasketaan ensin a/b scale-numeron
              tarkkuudella.  Tulosta käytetään 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, tämä lauseke on kokonaislukujen
              jakojäännösfunktio.

       expr ^ expr
              Tulos on ensimmäisen lausekkeen arvo korotettuna toisen lausekkeen
              ilmoittamaan potenssiin. Toisen lausekkeen täytyy olla
              kokonaisluku.  (Jos toinen lauseke ei ole kokonaisluku, annetaan
              varoitus ja lauseke typistetään niin, että siitä tulee
              kokonaisluku.) Tuloksen skaalaus on scale, jos eksponentti on
              negatiivinen. Jos eksponentti on positiivinen, tuloksen skaalaus
              on  minimi ensimmäisen lausekkeen skaalauksesta kertaa eksponentin
              arvo ja scale:n ja ensimmäisen lausekkeen skaalauksen maksimista.
              (esim. scale(a^b) = min(scale(a)*b, max( scale, scale(a))).)
              Huomattakoon, että expr^0 palauttaa aina arvon 1.

       ( expr )
              Muuttaa laskentajärjestyksen ja antaa lausekkeen tuloksen.

       var = expr
              Muuttujaan asetetaan lausekkeen arvo.

       var <op>= expr
              Yhtä kuin "var = var <op> expr" sillä poikkeuksella, että "var"
              osan arvo lasketaan vain kerran. Tällä on merkitystä, jos "var" on
              taulukko.

       Vertailulausekkeet ovat erityislausekkeita, jotka antavat aina tulokseksi
       0 tai 1, 0 jos vertailu on epätosi ja 1 jos se on tosi.  Ne voivat
       esiintyä kaikissa laillisissa lausekkeissa. (POSIX bc sallii
       vertailulausekkeiden käytön 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 yhtäsuuri kuin expr2.

       expr1 > expr2
              Tulos on 1, jos expr1 on suurempi kuin expr2.

       expr1 >= expr2
              Tulos on 1, jos expr1 on suurempi tai yhtäsuuri kuin expr2.

       expr1 == expr2
              Tulos on 1, jos expr1 on yhtäsuuri kuin expr2.

       expr1 != expr2
              Tulos on 1, jos expr1 on erisuuri kuin expr2.

       Boolen operaatiot ovat myös laillisia. (POSIX bc EI tunne boolen
       operaatioita). Kaikkien boolen operaatioiden tulos on 0 tai 1 (vast.
       epätosi 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 laskentajärjestys on seuraava: (alimmasta ylimpään)
              || 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

       Laskentajärjestys on valittu niin, että POSIX-yhteensopivat bc-ohjelmat
       toimivat oikein. Tämän seurauksena vertailu- ja loogiset operaattorit
       käyttäytyvät epätavallisesti sijoituslauseissa. Tarkastellaan lauseketta
              a = 3 < 5

       Useimmat C-ohjelmoijat olettaisivat, että tässä sijoitettaisiin
       lausekkeen "3 < 5" tulos (arvo 1) muuttujaan "a". Se mitä bc tekee, on
       arvon 3 sijoitus muuttujaan "a" ja sitten vertailu 3 ja 5 välillä. On
       paras käyttää sulkuja, jos käyttää vertailu- ja loogisia operaattoreita
       yhdessä sijoitusoperaattorin kanssa.

       bc:ssä on lisäksi muutamia muita erikoisoperaattoreita, joita käytetään
       käyttäjän määrittelemien funktioiden ja vakiofunktioiden kanssa.  Niiden
       ulkonäkö on "nimi(parametrit)".  Katso käyttäjän funktioita koskevaa
       lukua. Vakiofunktiot ovat:

       length ( lauseke )
              length (pituus) -funktion arvo on lausekkeen merkitsevien
              numeroiden lukumäärä.

       read ( )
              read-funktio (laajennus) lukee luvun vakiosyötteestä riippumatta
              siitä, missä funktio kohdataan. Tämä voi aiheuttaa pulmia
              vakiosyötöstä tulevien tietojen ja ohjelman sekoittuessa. Paras
              tapa käyttää tätä funktiota on käyttää sitä valmiissa ohjelmassa
              lukemaan käyttäjän syöttämää tietoa, mutta ei koskaan sallia
              ohjelmakoodin syöttämistä sille.  read-funktion arvo on luku, joka
              luetaan vakiosyötöstä käyttämällä ibase:n käypää arvoa
              konversiokantalukuna.

       scale ( lauseke )
              scale-funktion arvo on lausekkeen desimaalipisteen jälkeisten
              numeroiden lukumäärä.

       sqrt ( lauseke )
              sqrt (neliöjuuri) -funktion arvo on lausekkeen neliöjuuri. Jos
              lauseke on negatiivinen, tuloksena on ajonaikainen virhe.

   LAUSEET
       Kuten useimmissa algebrallisissa kielissä, myös bc:ssä lauseet
       jonouttavat lausekkeiden arvojen laskennan. bc:ssä lauseet suoritetaan
       "niin pian kuin mahdollista". Suoritus tapahtuu, kun koodissa tulee
       vastaan rivinvaihto ja yksi tai useampia valmiita lauseita on olemassa.
       Tämän välittömän suorituksen takia rivinvaihdot ovat hyvin tärkeitä bc-
       kielessä. Sekä puolipistettä että rivinvaihtoa käytetään
       lauseenerottimina. Väärään paikkaan sijoitettu rivinvaihto aiheuttaa
       syntaksivirheen. Koska rivinvaihdot ovat lauseenerottimia, on mahdollista
       kätkeä rivinvaihto käyttämällä kenoviivamerkkiä.  Merkkijono "\<nl>",
       jossa <nl> on rivinvaihto, näkyy bc:lle välilyöntinä eikä rivinvaihtona.
       Lauselista (a statement list) on puolipisteiden ja rivinvaihtojen
       erottama sarja lauseita. Seuraavassa on lista bc-lauseita ja kuvaukset
       siitä, mitä ne tekevät: (Hakasulkuihin suljetut osat ([]) ovat lauseen
       valinnaisia osia.)

       lauseke
              Tämä lause tekee jomman kumman kahdesta vaihtoehdosta. Jos lauseke
              alkaa "<muuttuja> <sijoitusoperaattori> ...", 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
              käyttäen kantalukuna muuttujan obase määrittelemää kantalukua.
              Muuttujan obase lailliset arvot ovat välillä 2 - BC_BASE_MAX.
              (Katso kappaletta RAJAT.)  Kantaluvuilla 2 - 16 kirjoitetaan
              tavalliseen tapaan numeroita.  Jos kantaluku on suurempi kuin 16,
              bc käyttää monimerkkistä tulostusmenetelmää, jossa 16 suuremmat
              kantaluvut kirjoitetaan kymmenkantaisina lukuina, jotka erotetaan
              toisistaan välilyönnein.  Kukin tällainen "numero" sisältää niin
              monta merkkiä kuin tarvitaan esittämään "obase-1" kymmenkantaisena
              lukuna. Kun luvut ovat tarkkuudeltaan mielivaltaisen suuria,
              joitakin niistä ei voida tulostaa yhdelle riville.  Nämä pitkät
              luvut jaetaan usealle riville käyttämällä merkkiä "\" rivin
              viimeisenä merkkinä. Riville voidaan tulostaa enintään 70 merkkiä.
              bc:n vuorovaikutteisesta tulostustavasta seuraa sivuvaikutuksena
              tulostetun arvon sijoitus erityismuuttujaan last. Tämä tekee
              käyttäjälle 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 säilyy
              kunnes uusi luku tulostetaan tai uusi arvo sijoitetaan muuttujaan
              last. (Jotkut installaatiot voivat hyväksyä yhden pisteen (.)
              käytön "pikakirjoitusmerkkinä" muuttujanimen last sijasta.)

       merkkijono
              Merkkijono kirjoitetaan tulostukseen. Merkkijonot alkavat
              kaksoislainausmerkillä ja sisältävät kaikki merkit seuraavaan
              kaksoislainausmerkkiin asti. Kaikki merkit otetaan sellaisinaan,
              myös rivinvaihdot. Rivinvaihtomerkkiä ei tulosteta merkkijonon
              jälkeen.

       print lista
              print-lause (laajennus) on tulostusmenetelmä. "lista" on pilkuilla
              erotettu merkkijonojen ja lausekkeiden lista. Kukin merkkijono tai
              lauseke tulostetaan listan mukaisessa järjestyksessä. Loppuun ei
              tulosteta rivinvaihtomerkkiä. Lausekkeiden arvot lasketaan,
              tulostetaan ja sijoitetaan muuttujaan last. print-lauseen
              merkkijonot tulostetaan.  Niissä voi olla erikoismerkkejä.
              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) ja "\" (backslash).  Muita kenoviivan jälkeisiä merkkejä
              ei oteta huomioon.

       { lause_lista }
              Tämä on yhdistelmälause. 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
              sisällä 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 jälkeen lasketaan
              lausekkeen lauseke3 arvo, ennen kuin lausekkeen lauseke2 arvo
              lasketaan uudestaan. Jos lauseke1 tai lauseke3 puuttuvat, mitään
              ei lasketa siinä 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  Tämä lause aiheuttaa pakollisen poistumisen viimeksi aloitetusta
              while- tai for-lauseesta.

       continue
              continue-lause (laajennus) saa 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 )
              Palauttaa lausekkeen arvon funktiosta. (Katso lukua funktioista.)

   VALELAUSEET
       Nämä lauseet eivät ole lauseita vakiintuneessa mielessä. Ne eivät ole
       suoritettavia lauseita, vaan ne toteutetaan "käännösaikana".

       limits Tulostaa bc:n paikallisen toteutuksen mukaiset rajat. Tämä on
              laajennus.

       quit   Kun quit-lause luetaan, bc-prosessori lopettaa toimintansa
              riippumatta siitä, mistä quit-lause löytyy. Esimerkiksi "if (0 ==
              1) quit" aikaansaa bc:n lopetuksen.

       warranty
              Tulostaa pitkähkön vastuuhuomautuksen (laajennus).

   FUNKTIOT
       Funktiot tarjoavat keinon määritellä laskutoimitus myöhempää suoritusta
       varten.  bc:n funktiot laskevat aina arvon ja palauttavat sen kutsuvalle
       ohjelmalle.  Funktiomääritykset ovat "dynaamisia" siinä mielessä, että
       funktio on määrittelemätön, kunnes määrittely tulee vastaan syötteessä.
       Tätä määrittelyä käytetään, kunnes toinen samanniminen määrittely tulee
       vastaan. Tällöin uusi määrittely korvaa vanhemman. Funktio määritellään
       seuraavasti:
              define nimi ( parametrit ) { rivinvaihto
                  auto_lista   lause_lista }
       Funktiokutsu on seuraavan muotoinen lauseke: "nimi(parametrit)".

       Parametrit ovat lukuja tai taulukoita (laajennus). Funktionmäärittelyssä
       nolla tai useampia parametreja määritellään listaamalla niiden nimet
       pilkuilla erotettuina.  Luvut ovat vain arvoina kutsuttavia parametreja.
       Taulukoita kutsutaan vain muuttujina. Taulukot merkitään parametreja
       määriteltäessä "nimi[]". Funktiokutsussa lukuparametreja vastaavat
       todelliset parametrit ovat täydellisiä lausekkeita.  Taulukoiden
       siirtämiseen funktiokutsussa käytetään samaa merkintää kuin
       taulukkoparametrien määrittelyssä. Nimetty taulukko siirretään funktioon
       muuttujana. Kun funktiomäärittelyt ovat dynaamisia, parametrien
       lukumäärät ja tyypit tarkistetaan funktiota kutsuttaessa. Jos parametrien
       lukumäärät tai tyypit poikkeavat, tulee ilmoitus ajonaikaisesta
       virheestä. Myös määrittelemättömän funktion kutsuminen aiheuttaa
       ajonaikaisen virheen.

       auto_lista on valinnainen "paikalliseen" käyttöön tarkoitettujen
       muuttujien luettelo. Auto_listan (jos se on olemassa) syntaksi on "auto
       nimi, ... ;".  (Puolipiste on valinnainen.) Kukin nimi on automaattisen
       muuttujan nimi.  Taulukot voi merkitä samoin kuten parametrit. Näiden
       muuttujien arvot työnnetään pinoon funktion alussa. Sitten muuttujat
       alustetaan nolliksi ja niitä käytetään funktion suorituksen ajan.
       Funktion päättyessä nämä muuttujat palautetaan, "popataan" niin, että
       niiden alkuperäiset (funktiokutsun aikaiset) arvot palautuvat.
       Parametrit ovat tosiasiassa automaattisia muuttujia, jotka alustetaan
       funktiokutsun mukaisiin arvoihin. Automaattiset muuttujat poikkeavat
       perinnäisistä paikallisista muuttujista siinä, että jos funktio A kutsuu
       funktiota B, B voi käyttää funktion A automaattimuuttujia käyttäen samaa
       nimeä, ellei funktio B ole kutsunut niitä automaattimuuttujiksi.  bc
       mahdollistaa rekursiiviset funktiot, koska automaattimuuttujat ja
       parametrit työnnetään pinoon.

       Funktion runko on lista bc-lauseita. Tässäkin lauseet erotetaan
       toisistaan puolipistein tai rivinvaihdoin. Return-lauseet aikaansaavat
       funktion päättymisen ja arvon palautuksen.  Return-lauseita on kahta
       versiota. Näistä ensimmäinen, "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 eksplisiittistä return-lausetta.

       Funktiot muuttavat myös muuttujan ibase käyttötapaa. Kaikki funktiorungon
       vakiot konvertoidaan käyttäen funktiokutsun aikaista muuttujan ibase
       arvoa.Muuttujan ibase arvon muutoksia ei oteta huomioon funktion
       suorituksen aikana lukuunottamatta standardifunktiota read, joka käyttää
       aina ibase:n käypää arvoa lukujen konversioon.

   MATEMAATTINEN KIRJASTO
       Jos bc kutsutaan -l optiota käyttäen, matemaattinen kirjasto ladataan ja
       oletusskaalaukselle annetaan arvo 20.  Matemaattiset funktiot laskevat
       tuloksensa käyttäen niiden kutsumisen aikaista skaalausarvoa.
       Matemaattisessa kirjastossa on seuraavat funktiot:

       s (x)  Sini x:stä, x radiaaneina.

       c (x)  Kosini x:stä, x radiaaneina.

       a (x)  Arcustangentti x:stä, palauttaa tuloksen radiaaneina.

       l (x)  Luonnollinen logaritmi x:stä.

       e (x)  Exponenttifunktio, jossa e korotetaan potenssiin x.

       j (n,x)
              Kokonaislukukertalukua n oleva bessel-funktio x:stä.

   ESIMERKIT
       Käytettäessä komentotulkkia /bin/sh, seuraava sijoittaa arvon "pi"
       komentotulkkimuuttujaan pi.
               pi=$(echo "scale=10; 4*a(1)" | bc -l)

       Seuraava on matemaattisen kirjaston eksponenttifunktion määrittely. Se on
       kirjoitettu käyttäen POSIX bc:tä.
              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 käyttää bc:n laajennuksia yksinkertaisen shekkitilisaldo-
       ohjelman toteuttamiseen. Ohjelma on paras pitää tiedostossa niin, että
       sitä 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 kertomafunktion määritelmä.
              define f (x) {
                if (x <= 1) return (1);
                return (f(x-1) * x);
              }

   READLINE-OPTIO
       GNU bc voidaan kääntää (configure-option avulla) käyttämään GNU readline
       input editor -kirjastoa. Tämä sallii käyttäjän editoida rivejä enemmän
       ennen niiden lähettämistä bc:lle.  Se sallii myös edellisten rivien
       muodostaman historian käytön.  Kun tämä optio on valittu, bc:ssä on yksi
       erityismuuttuja enemmän.  Tämä erityismuuttuja, history on säilytettyjen
       historiarivien lukumäärä. Sen arvo -1 tarkoittaa, että rajaton rivimäärä
       säilytetään.  Tämä on oletusarvo. Jos history:n arvoksi asetetaan
       positiivinen luku, historiarivien lukumäärä rajoitetaan kyseisen luvun
       suuruiseksi.  Arvo 0 poistaa historiaominaisuuden käytöstä. Lisätietoja
       saat GNU readline- ja history-kirjastojen käyttöohjeista.

   EROAVUUDET
       Tämä bc:n versio on toteutettu POSIX P1003.2/D11 luonnoksen mukaan ja
       sisältää useita eroavuuksia ja laajennuksia verrattuna luonnokseen ja
       perinnäisiin toteutuksiin. Sitä ei ole toteutettu perinteiseen tapaan
       käyttämällä ohjelmaa dc(1).  Tämä versio on yksi prosessi, joka tulkitsee
       (parses) ja ajaa ohjelman tavukoodikäännöksen (byte code translation). On
       olemassa "dokumentoimaton" optio (-c), joka saa ohjelman tulostamaan
       tavukoodin sen toteuttamisen sijasta. Sitä käytetään pääasiassa
       debuggaamiseen ja matemaattisen kirjaston valmistamiseen.

       Pääasiallinen eroavuuksien lähde ovat laajennukset, joissa jotakin
       ominaisuutta on laajennettu toimivuuden parantamiseksi ja lisäykset,
       joissa uusia ominaisuuksia on lisätty. Seuraava on eroavuuksien ja
       laajennusten luettelo.

       LANG   Tämä versio ei ole POSIX-standardin mukainen käsitellessään LANG-
              ympäristömuuttujaa ja kaikkia LC_-alkuisia ympäristömuuttujia.

       nimet  Traditionaalinen ja POSIX bc käyttävät yhden kirjaimen nimiä
              funktioissa, muuttujissa ja taulukoissa.  Nämä nimet on
              laajennettu monimerkkisiksi nimiksi, jotka alkavat kirjaimella ja
              voivat sisältää kirjaimia, numeroita ja alleviivamerkkejä.

       Merkkijonot
              Merkkijonoissa ei saa olla NUL-merkkejä. POSIX sallii kaikkien
              merkkien käytön merkkijonoissa.

       last   POSIX bc:ssä ei ole last muuttujaa. Jotkut bc toteutukset
              käyttävät pistettä (.) samaan tapaan.

       vertailut
              POSIX bc sallii vertailut vain if-lauseessa, while-lauseessa ja
              for-lauseen toisessa lausekkeessa. Lisäksi vain yksi
              vertailuoperaatio on sallittu jokaisessa näistä 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.

       taulukkoparametrit
              POSIX bc ei (toistaiseksi) täysin tue taulukkoparametreja.  POSIX
              kielioppi hyväksyy taulukot funktion määrityksessä, mutta ei
              tarjoa menetelmää taulukon määrittelemiseksi todellisena
              parametrina.  (Tässä on todennäköisimmin kysymys kieliopin
              laatijan huomaamattomuudesta.)  bc:n perinteisissä toteutuksissa
              on käytössä vain taulukkoparametrien arvoina kutsuminen.

       =+, =-, =*, =/, =%, =^
              POSIX bc ei edellytä näiden "vanhantyylisten"
              sijoitusoperaattorien määrittelyä. Tämä versio sallii nämä
              "vanhantyyliset" sijoitukset.  Käytä limits-lausetta nähdäksesi,
              tukeeko installoitu versio niitä.  Jos se ei tue "vanhantyylisiä"
              sijoitusoperaattoreita, lause "a =- 1" vähentää a:n arvoa yhdellä
              sen sijaan, että se sijoittaisi siihen arvon -1.

       välilyönnit luvun sisällä
              Muut bc:n toteutukset sallivat välilyöntejä luvun sisällä. Siten
              lause "x=1 3" sijoittaisi arvon 13 muuttujaan x.  Sama lause
              aiheuttaisi syntaksivirheen tässä versiossa.

       Virheet ja ohjelman suoritus
              Tämä toteutus poikkeaa muista toteutuksista siinä, miten koodi
              suoritetaan kun syntaksi- ja muita virheitä löytyy ohjelmasta. Jos
              syntaksivirhe löytyy funktion määrittelystä,
              virheestätoipumisrutiini yrittää löytää lauseen alun ja jatkaa
              funktion tulkintaa. Kun funktiosta löytyy syntaksivirhe, funktiota
              ei voi kutsua ja siitä tulee määrittelemätön.  Vuorovaikutteisen
              suoritettavan koodin syntaksivirheet tekevät suorituksen alaisesta
              lohkosta epäkelvon. Suoritettava lohko lopetetaan sen rivin
              lopussa, joka seuraa täydellistä lausejonoa.  Esimerkiksi
               a = 1
               b = 2
              on kaksi suoritettavaa lohkoa ja
               { a = 1
                 b = 2 }
              on yksi suoritettava lohko. Ajonaikainen virhe lopettaa
              suorituksen alaisen lohkon suorituksen. Ajonaikainen varoitus ei
              lopeta suorituksen alaisen lohkon suoritusta.

       Keskeytykset
              Vuorovaikutteisen istunnon aikana SIGINT-signaali (jonka
              tavallisesti kehittää päätteeltä annettu control-C -merkki)
              keskeyttää suorituksen alaisen lohkon suorituksen. Se näyttää
              "ajonaikaisen" virheen, joka osoittaa, että funktio keskeytettiin.
              Kun kaikki ajonaikaiset rakenteet on siivottu, tulostetaan
              ilmoitus käyttäjälle siitä, että bc on valmis ottamaan vastaan
              tietoa. Kaikki aikaisemmin määritellyt funktiot säilyvät
              määriteltyinä 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
       Tämä bc -prosessori käyttää nykyisin seuraavia raja-arvoja. Joitakin
       niistä on ehkä muutettu asennuksen yhteydessä. Käytä limits-lausetta
       nähdäksesi todelliset arvot.

       BC_BASE_MAX
              Tulostuskantaluvun maksimiarvo on nykyisin asetettu arvoon 999.
              Syöttökantaluvun maksimiarvo on 16.

       BC_DIM_MAX
              Nykyisissä jakeluversioissa käytetään mielivaltaista arvoa 65535.
              Sinun versiosi arvo voi olla toinen.

       BC_SCALE_MAX
              Desimaalipisteen jälkeisten numeroiden lukumäärä on rajoitettu
              INT_MAX numeroon. Myös ennen desimaalipistettä olevien numeroiden
              määrä on rajoitettu INT_MAX numeroon.

       BC_STRING_MAX
              Merkkijonon merkkien lukumäärä on rajoitettu INT_MAX merkkiin.

       eksponentti
              Eksponentin arvo potenssiinkorotusoperaatiossa (^) on rajoitettu
              arvoon LONG_MAX.

       kertolasku
              Kertolaskurutiini voi antaa vääriä tuloksia, jos luvussa on
              yhteensä enemmän kuin LONG_MAX / 90 numeroa. 32 bittiä pitkillä
              luvuilla tässä luvussa on 23 860 929 numeroa.

       koodin koko
              Kukin funktio ja "pääohjelma" on rajoitettu 16384 tavuun
              käännettyä tavukoodia. Tämä raja (BC_MAX_SEGS) voidaan helposti
              muuttaa niin, että käytetään enemmän kuin 16 segmenttiä à 1024
              tavua.

       muuttujanimet
              Nykyinen raja yksikäsitteisten nimien lukumäärälle on 32767 sekä
              yksinkertaisille muuttujille, taulukoille että funktioille.

YMPÄRISTÖMUUTTUJAT
       bc käsittelee seuraavia ympäristömuuttujia:

       POSIXLY_CORRECT
              Sama kuin -s optio.

       BC_ENV_ARGS
              Mekanismi, jolla saadaan argumentteja bc-ohjelmalle. Muoto on sama
              kuin komentoriviargumenteilla. Nämä argumentit prosessoidaan
              ensin, niin että ympäristömuuttujissa luetellut tiedostot
              prosessoidaan ennen komentorivillä annettuja tiedostoja. Käyttäjä
              voi siten asettaa "standardioptioita ja -tiedostoja", jotka
              prosessoidaan aina ohjelmaa bc kutsuttaessa. Ympäristömuuttujissa
              annetut tiedostot sisältävät tavallisesti niiden funktioiden
              määritykset, jotka käyttäjä haluaa määritellä joka kerta, kun bc
              ajetaan.

       BC_LINE_LENGTH
              Kokonaisluku, joka määrittelee lukuja sisältävien tulostusrivien
              merkkimäärän. Se sisältää pitkien lukujen sisältämät kenoviivat ja
              rivinvaihdot.

TIEDOSTOT
       Useimmissa versioissa bc ei tarvitse aputiedostoja.  Kun suorittettavan
       moduulin koko on suuri tai C-kääntäjä ei pysty käsittelemään hyvin pitkiä
       merkkijonoja, bc lukee standardimatematiikkakirjaston tiedostosta
       /usr/local/lib/libmath.b.  (Todellinen paikka voi vaihdella. Se voi olla
       /lib/libmath.b.)

DIAGNOSTIIKKA
       Jos komentorivillä mainittua tiedostoa ei voi avata, bc ilmoittaa, että
       tiedosto ei ole käytettävissä ja lopettaa suorituksen. Käännös- ja
       ajonaikaiset diagnostiset ilmoitukset ovat itseselitteisiä.

BUGIT
       Virheistä toipuminen ei vielä ole kovin hyvä.

       Postita bugiraportit (englanniksi) osoitteeseen bug-gnu-
       utils@prep.ai.mit.edu.  Muista lisätä sana ``bc'' kenttään ``Subject:''.

TEKIJÄ
       Philip A. Nelson
       phil@cs.wwu.edu

KIITOKSET
       Tekijä haluaa kiittää Steve Sommarsia (Steve.Sommars@att.com) laajasta
       sovelluksen toteutuksen testausavusta ja monista erinomaisista
       parannusehdotuksista. Hänen ansiostaan tuote on paljon parantunut.




                               7. Huhtikuuta 1998                          bc(1)