bc (programovací jazyk)

UNIXový nástroj, který implementuje libovolně přesný aritmetický jazyk

bc je jazyk pro numerické výpočty s libovolnou přesností se syntaxí podobnou programovacímu jazyku C. Zpravidla je používán napsáním příkazu bc na Unixovém příkazovém řádku (shellu) a zadáním matematického výrazu, jako (1 + 3) * 2, kdy na výstupu ihned obdržíme výsledek 8.

V současné době existují dva dialekty jazyka: přísně definovaný POSIX bc a jeho přímý následník, mnohem rozšířenější GNU bc.

Obě formy bc lze spouštět buď jako matematický skriptovací jazyk, nebo jako interaktivní matematický shell.

POSIX bc

editovat

Standardizovaný jazyk POSIX bc je tradičně napsán jako program v programovacím jazyce dc, aby tak na vyšší úrovni poskytl přístup k jeho vlastnostem bez složitosti strohé syntaxe dc.

V této formě obsahuje bc jednopísmenná označení pro proměnné, pole a funkce a většinu standardních aritmetických operátorů, stejně jako řídící struktury (if(podmínka)…, while(podmínka)… a for(inicializace; podmínka; inkrementace)…) známé z jazyka C. Na rozdíl od C však nesmí být klauzule if následována else.

Funkce jsou definovány prostřednictvím klíčového slova define a hodnoty jsou vraceny pomocí příkazu return, následovaného návratovou hodnotou v závorkách. Klíčové slovo auto slouží k deklaraci lokální proměnné funkce.

Všechna čísla a obsah proměnných jsou reálná čísla s pevně danou přesností, jež je (na úrovni desetinných míst) určena globální proměnnou scale.

Číselnou soustavu vstupu (v interaktivním režimu), výstupu a programových konstant lze specifikovat nastavením rezervovaných proměnných ibase (input base, číselná soustava pro vstup) a obase (output base, číselná soustava pro výstup).

Výstup je generovaný tehdy, není-li výsledek výpočtu záměrně uložen do proměnné.

Komentáře mohou být do kódu bc vloženy pomocí symbolů ve stylu C: /* pro začátek a */ pro označení konce komentáře.

Matematické operátory

editovat

Stejné jako v C

editovat

Následující POSIX bc operátory pracují ve shodě se svými ekvivalenty v jazyce C:

 +     -     *     /
 
 +=    -=    *=    /=
 
 ++    --    <     >
 
 ==    !=    <=    >=
 
 ( )   [ ]   { }

Podobné jako v C

editovat

Operátory pro modulo (zbytek po celočíselném dělení):

 %     %=

…se chovají naprosto stejně jako jejich protějšky v C pouze tehdy, je-li globální proměnná scale nastavena na 0, tj. všechny výpočty jsou výhradně celočíselné. Je-li scale větší než 0, je modulus vypočítán ve vztahu k nejmenší kladné hodnotě větší než 0.

Pouze připomínající C

editovat

Operátory:

 ^     ^=

…vypadají jako bitové operátory exlusive-or (xor) v jazyce C, ale ve skutečnosti jsou to v bc exponenciální operátory.

Operátory, které chybí

editovat

Bitové, boolovské a podmíněné operátory:

 &     |     ^     &&    ||    ^^
 
 &=    |=    ^=    &&=   ||=   ^^=
 
 <<    >>
 
 <<=   >>=
 
 ?:

…nejsou v POSIX bc dostupné.

Zabudované funkce

editovat

Funkce sqrt() pro výpočet druhé odmocniny je v POSIX bc jedinou zabudovanou matematickou funkcí. Další funkce jsou dostupné v externí standardní knihovně.

Funkce standardní knihovny

editovat

Standardní knihovna bc obsahuje funkce pro výpočet sinu, cosinu, arcus tangens, přirozeného logaritmu, exponenciální funkci a dvouparametrickou Besselovu funkci J.

GNU bc vychází ze standardu POSIX a obsahuje mnohá vylepšení. Je zcela oddělen od implementací založených na dc (POSIX dc) a namísto toho je celý napsán v C. Přesto zachovává naprostou zpětnou kompatibilitu a tak všechny bc programy dle standardu POSIX poběží v nezměněné podobě i jako GNU bc programy.

Názvy proměnných, polí a funkcí mohou v GNU bc sestávat z více znaků, byly přidány některé další operátory z C a především, klauzule if může být následována else.

Výstup je zajištěn buď ve stylu POSIX (tedy když výsledek výpočtu není přiřazen žádné proměnné), nebo za použití dodatečného příkazu print.

Navíc, příkaz read umožňuje interaktivní vkládání číselných hodnot za běhu výpočtu.

Jako přídavek ke komentářům ve stylu C, znak # způsobí, že cokoli je za ním až do konce řádku je ignorováno.

Výsledek posledního výpočtu je vždy uložen v dodatečně zabudované proměnné last.

Dodatečné operátory

editovat

Následující logické operátory rozšiřují výčet operátorů z POSIX bc:

&&     ||      !

…a je možné je použít v podmíněných konstrukcích (např. if). Nicméně bitové a přiřazovací operátory stále nemají v bc svůj ekvivalent.

Veškeré funkce dostupné v GNU bc jsou poděděné ze standardu POSIX, žádné dodatečné funkce nejsou standardně v distribuci zahrnuty.

Ukázka kódu

editovat

Jelikož operátor ^ dovoluje na místě exponentu pouze celé číslo, jednou z prvních funkcí, které může uživatel napsat, je funkce s reálným exponentem. Oba níže uvedené příklady předpokládají použití standardní knihovny:

Funkce mocnina v POSIX bc

editovat
/* Funkce, ktera vrati celociselnou cast x */
define i(x) {
   auto s
   s = scale
   scale = 0
   x /= 1   /* zaokrouhli x dolu */
   scale = s
   return (x)
}

/* Vyuziva skutecnosti, ze x^y == e^(y*log(x)) */
define m(x,y) {
   if (y == i(y)) {
      return (x ^ y)
   }
   return ( e( y * l(x) ) )
}

Ekvivalentní funkce v GNU bc

editovat
# Funkce, ktera vrati celociselnou cast promenne cislo
define int(cislo) {
   auto oldscale
   oldscale = scale
   scale = 0
   cislo /= 1 /* round number down */
   scale = oldscale
   return cislo
}

# Vyuziva skutecnosti, ze cislo^exponent == e^(exponent*log(cislo))
define mocnina(cislo,exponent) {
   if (exponent == int(exponent)) {
      return cislo ^ exponent
   } else {
      return e( exponent * l(cislo) )
   }
}

Související články

editovat

Externí odkazy

editovat