Provided by: manpages-fi_0.2-2_all bug

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)