bc(1) | General Commands Manual | bc(1) |
bc - Mielivaltaisen tarkkuuden laskentakieli
bc [ -hlwsqv ] [long-options] [ file ... ]
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.
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.
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 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.
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
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
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:
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
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:
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.)
lauseke1; while (lauseke2) {
lause;
lauseke3; }
Nämä lauseet eivät ole lauseita vakiintuneessa mielessä. Ne eivät ole suoritettavia lauseita, vaan ne toteutetaan "käännösaikana".
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<---
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.
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:
Käytettäessä komentotulkkia /bin/sh, seuraava sijoittaa "pi" arvon komentotulkkimuuttujaan pi.
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); }
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.
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.
a = 1 b = 2
{ a = 1
b = 2 }
on yksi suoritettava lohko. Ajoaikainen virhe lopettaa suorituksen alaisen lohkon suorituksen. Ajoaikainen varoitus ei lopeta suorituksen alaisen lohkon suoritusta.
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 käsittelee seuraavia ympäristömuuttujia:
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ä.
Virheistä toipuminen ei vielä ole kovin hyvä.
Postita bugiraportit (englanniksi) osoitteeseen bug-bc@gnu.org. Muista lisätä sana “bc” kenttään “Subject:”.
Philip A. Nelson philnelson@acm.org
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.
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 tai uudemmasta. Emme ota vastuuta.
11. kesäkuuta 2006 | GNU Project |