Provided by: manpages-fi_4.15.0-9_all bug

NIMI

       bc - Mielivaltaisen tarkkuuden laskentakieli

SYNTAKSI

       bc [ -hlwsqv ] [long-options] [  file ... ]

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 tiedostot on kutsuttu. Kun kaikki  tiedostot  on  käsitelty,  bc
       lukee  vakiosyöttöä.   Kaikki  ohjelmakoodi  suoritetaan  sitä mukaa kuin se luetaan. (Jos
       tiedostossa on prosessorin pysäyttävä komento, bc ei koskaan lue vakiosyöttöä.)

       Tämä bc:n versio sisältää lukuisia laajennuksia verrattuina perinnäisiin  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.

   VALITSIMET
       -h, --help
              Print the usage and exit.

       -i, --interactive
              Force interactive mode.

       -l, --mathlib
              Määrittele vakiomatematiikkakirjasto.

       -w, --warn
              Varoita bc:n laajennuksista POSIXiin verrattuna.

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

       -q, --quiet
              Älä 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
       sääntiöihin.  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
       sääntiömuuttujan 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  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).   Kun 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.)

       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.

       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 sääntiömuuttujaa.  Yksinkertainen muuttuja määritellään
              nimi
       ja sääntiömuuttuja
              nimi[expr]
       Ellei   erityisesti   toisin   mainita,  tuloksen  skaalaus  on  käytettyjen  lausekkeiden
       maksimiskaalaus.

       - expr 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  tuloksen  skaalaus  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 sääntiö.

       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:ssa   on  lisäksi  muutamia  muita  erikoisoperaattoreita,  joita  käytetään  käyttäjän
       määrittelemien   funktioiden   ja   vakiofunktioiden   kanssa.    Niiden    ulkonäkö    on
       "name(parameters)".  Katso käyttäjän funktioita koskevaa lukua. Vakiofunktiot ovat:

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

       read ( )
              read funktio (laajennus) lukee luvun vakiosyötöstä 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 ( expression )
              scale funktion arvo on lausekkeen desimaalipisteen jälkeisten numeroiden lukumäärä.

       sqrt ( expression )
              sqrt  (neliöjuuri)  funktion  arvo  on  lausekkeen  neliöjuuri.  Jos   lauseke   on
              negatiivinen, tuloksena on ajoaikainen 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.)

       expression
              Tämä  lause  tekee  jomman  kumman  kahdesta asiasta. 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.)

       string Merkkijono    ("string")    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 list
              print-lause   (laajennus)   on  tulostusmenetelmä.  "list"  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),  and  "\"  (backslash).   Muita  kenoviivan
              jälkeisiä merkkejä ei oeta 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) 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
       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ä, missä
              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ötössä. 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)".

       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. 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.

       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 function 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   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ä.

   ESIMERKKEJÄ
       Käytettäessä komentotulkkia /bin/sh, seuraava sijoittaa "pi" arvon 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.
              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 factoriaali-funktion määritelmä.
              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
       Tämä bc :n  versio  on  toteutettu  POSIX  P1003.2/D11  luonnoksesta  ja  sisältää  useita
       eroavuuksia  ja  laajennuksia verrattuna luonnokseen ja perinnäisiin toteutuksiin. Sitä ei
       ole toteutettu perinnäiseen  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äytettiin  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 environment
              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ä  funktioilla,
              muuttujilla ja sääntiöillä.  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.

       return statement
              POSIX bc requires parentheses around the return expression.

       sääntiöparametrit
              POSIX bc ei (toistaiseksi) täysin tue sääntiöparametreja.  POSIX kielioppi hyväksyy
              sääntiöt    funktion   määrityksessä,   mutta   ei   tarjoa   menetelmää   sääntiön
              määrittelemiseksi todellisena  parametrina.   (Tässä  on  todennäköisimmin  kysymys
              kieliopin  laatijan  huomaamattomuudesta.)   bc:n  perinnäisissä  toteutuksissa  on
              käytössä vain sääntiöparametrien 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  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ävalidin.  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.  Ajoaikainen  virhe  lopettaa  suorituksen  alaisen  lohkon
       suorituksen. Ajoaikainen 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ää  "ajoaikaisen"  virheen,  joka  osoittaa  että  funktio
              keskeytettiin. Kun kaikki ajoaikaiset 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 installoinnin 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
              installaatiosi 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.

       muuttujanimet
              Nykyinen raja yksikäsitteisten nimien lukumäärälle on 32767  sekä  yksinkertaisille
              muuttujille, sääntiöille 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
              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 komentorivillä mainittua  tiedostoa  ei  voi  avata,  bc  ilmoittaa  tiedosto  ei  ole
       käytettävissä  ja  lopettaa  suorituksen. Käännös- ja ajoaikaiset diagnostiset ilmoitukset
       ovat itseselitteisiä.

BUGIT

       Virheistä toipuminen ei vielä ole kovin hyvä.

       Postita bugiraportit (englanniksi) osoitteeseen bug-bc@gnu.org.  Muista lisätä  sana  “bc”
       kenttään “Subject:”.

TEKIJÄ

       Philip A. Nelson
       philnelson@acm.org

KIITOKSET

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

KÄÄNNÖS

       Tämän käsikirjan suomenkielisen käännöksen tekivät Tuukka Forssell <taf@jytol.fi>

       Tämä  käännös  on  ilmainen  dokumentaatio;  katso  tekijänoikeusehdot  GNU General Public
       License -versiosta 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ tai uudemmasta. Emme  ota
       vastuuta.