bc (programovací 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
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
Stejné jako v C
Následující POSIX bc operátory pracují ve shodě se svými ekvivalenty v jazyce C:
+ - * /
+= -= *= /=
++ -- < >
== != <= >=
( ) [ ] { }
Podobné jako v C
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
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í
Bitové, boolovské a podmíněné operátory:
& | ^ && || ^^
&= |= ^= &&= ||= ^^=
<< >>
<<= >>=
?:
…nejsou v POSIX bc dostupné.
Zabudované funkce
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
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
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
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.
Funkce
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
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
/* 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
# 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
Externí odkazy
- Specifikace POSIX bc (anglicky)
- Manuálová stránka GNU bc (anglicky)
- Linux v příkazech – aritmetika – článek na serveru linuxsoft.cz, jehož velká část se zabývá právě bc