bc (programovací jazyk) - bc (programming language)

před naším letopočtem
Vývojáři Robert Morris a Lorinda Cherry z Bell Labs , Philip A. Nelson
První vydání 1975, před 45–46 lety
Operační systém Unix , podobný Unixu , Plan 9 , FreeDOS
Plošina Cross-platform
Typ Příkaz

bc , pro základní kalkulačku (často označované jako lavice kalkulačky ), je „ libovolnou přesností kalkulačka jazyk “ se syntaxí podobnou C programovací jazyk . bc se obvykle používá buď jako matematický skriptovací jazyk, nebo jako interaktivní matematický shell.

Přehled

Typickým interaktivním využitím je napsání příkazu bc na příkazovém řádku Unixu a zadání matematického výrazu, například , načež (1 + 3) * 2 8 bude výstup. Zatímco bc může pracovat s libovolnou přesností, ve výchozím nastavení je ve skutečnosti nulové číslice za desetinnou čárkou, takže výraz 2/3 dává 0 . To může překvapit nové uživatele BC, kteří si tuto skutečnost neuvědomují. -l Možnost bc nastaví výchozí měřítko (číslice za desetinnou čárkou) do 20 ° C a přidává několik dalších matematických funkcí jazyka.

Dějiny

bc se poprvé objevil ve verzi 6 Unix v roce 1975 a napsali ji Robert Morris a Lorinda Cherry z Bell Labs . bc předcházela dc , dřívější kalkulačka s libovolnou přesností napsaná stejnými autory. dc mohl provádět výpočty s libovolnou přesností, ale jeho syntaxe reverzní polské notace (RPN) - kterou mnoho milovalo pro vyhodnocení algebraických vzorců - se pro její uživatele při vyjadřování řízení toku ukázala jako nepohodlná, a proto bc byl zapsán jako front-end pro dc. bc byl velmi jednoduchý kompilátor (jediný zdrojový soubor yacc s několika stovkami řádků), který převedl novou syntaxi bc typu C do postfixové dc notace a výsledky přenesl přes dc.

V roce 1991 POSIX důsledně definoval a standardizoval bc. Dnes přežívají tři implementace tohoto standardu: První je tradiční implementace Unix, front-end k dc, která přežívá v systémech Unix a Plan 9 . Druhým je svobodný software GNU BC, který poprvé vydal v roce 1991 Philip A. Nelson. Implementace GNU má řadu rozšíření nad rámec standardu POSIX a již není front-endem dc (jedná se o interpret kódu bytecode ). Třetí je re-implementace OpenBSD v roce 2003.

Implementace

POSIX bc

Standardizovaný jazyk bc POSIX je tradičně psán jako program v programovacím jazyce dc, aby poskytoval vyšší úroveň přístupu k funkcím stejnosměrného jazyka bez složitosti přísné syntaxe dc.

V této formě jazyk bc obsahuje jednopísmenné proměnné , názvy polí a funkcí a většinu standardních aritmetických operátorů, stejně jako známé konstrukty řízení toku ( , a ) z C. Na rozdíl od C, za klauzulí nemusí následovat . if(cond)...while(cond)...for(init;cond;inc)...ifelse

Funkce jsou definovány pomocí define klíčového slova a hodnoty jsou z nich vráceny pomocí return následované návratovou hodnotou v závorkách. auto Klíčové slovo (volitelně v C), se používá k deklarovat proměnné jako lokální funkce.

Všechna čísla a obsah proměnných jsou čísla s libovolnou přesností, jejichž přesnost (na desetinná místa) je určena globální scale proměnnou.

Číselnou soustavu vstupu (v interaktivním režimu), výstup a programové konstanty lze specifikovat nastavením vyhrazeného ibase (vstup základny) a obase (výstup základny) proměnných.

Výstup je generován záměrným nepřiřazením výsledku výpočtu k proměnné.

Do kódu bc lze přidávat komentáře pomocí symbolů C /* a */ (počáteční a koncový komentář).

Matematické operátory

Přesně jako C.

Následující operátoři POSIX bc se chovají přesně jako jejich C protějšky:

+     -     *     /
+=    -=    *=    /=
++    --    <     >
==    !=    <=    >=
( )   [ ]   { }
Podobně jako u C.

Mezi modulem operátory, % a %= chovají stejně jako jejich protějšky v C pouze tehdy, když globální scale je proměnná nastavena na 0, tedy všechny výpočty jsou integer-only. Jinak se výpočet provádí s příslušnou stupnicí. a%b je definován jako a-(a/b)*b . Příklady:

$ bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
scale=0; 5%3
2
scale=1; 5%3
.2
scale=20; 5%3
.00000000000000000002
Konflikt s C.

Provozovatelé

^     ^=

povrchně připomínají bitové výlučné operátory C nebo operátory, ale ve skutečnosti jsou operátory umocňování celočíselných čísel bc.

Za zvláštní zmínku stojí, že použití ^ operátoru se zápornými čísly nenásleduje přednost operátoru C. -2^2 dává odpověď 4 pod bc spíše než −4.

„Chybějící“ operátoři ve vztahu k C.

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

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

nejsou k dispozici v POSIX bc.

Integrované funkce

sqrt() Funkce pro výpočet druhé odmocniny je POSIX bc to jen vestavěný matematické funkce. Další funkce jsou k dispozici v externí standardní knihovně.

Integrována je také scale() funkce pro určení přesnosti (stejně jako u scale proměnné) jejího argumentu a length() funkce pro určení počtu významných desetinných míst v jejím argumentu.

Standardní funkce knihovny

BC standardní matematická knihovna (definované s -l volbou) obsahuje funkce pro výpočet sinus , kosinus , arkustangens , přirozený logaritmus , je exponenciální funkci a dvě parametr Besselovu funkci J . Většinu standardních matematických funkcí (včetně ostatních inverzních trigonometrických funkcí) lze sestavit pomocí nich. Viz externí odkazy pro implementaci mnoha dalších funkcí.

BC standardní knihovna
bc příkaz Funkce Popis
s(x) Sinus Vezme x , úhel v radiánech
c(x) Kosinus Vezme x , úhel v radiánech
a(x) Arkustangens Vrací radiány
l(x) Přirozený logaritmus
e(x) Exponenciální funkce
j(n,x) Besselova funkce Vrátí order- n Besselova funkce x .

Možnost -l změní měřítko na 20, takže věci jako modulo mohou fungovat nečekaně. Například zápis bc -l a poté příkaz print 3%2 vydá 0. Ale zápis scale=0 za bc -l a potom příkaz print 3%2 vydá 1.

Plán 9 př

Plan 9 bc je totožný s POSIX bc, ale pro další print prohlášení.

GNU př

GNU bc pochází ze standardu POSIX a obsahuje mnoho vylepšení. Je zcela odděleno od implementací standardu POSIX založených na stejnosměrném proudu a místo toho je napsáno v jazyce C. Přesto je plně zpětně kompatibilní, protože všechny programy POSIX bc poběží beze změny jako programy GNU bc.

Proměnné GNU bc, pole a názvy funkcí mohou obsahovat více než jeden znak, některé další operátory byly zahrnuty z C a zejména za if klauzulí může následovat else .

Výstupu je dosaženo buď záměrným nepřiřazením výsledku výpočtu proměnné (způsobem POSIX), nebo použitím přidaného print příkazu.

Příkaz dále read umožňuje interaktivní zadání čísla do běžícího výpočtu.

Kromě komentářů ve stylu C # způsobí postava po něm vše, dokud nebude ignorován další nový řádek.

Hodnota posledního výpočtu je vždy uložena v další vestavěné last proměnné.

Extra operátoři

Následující logické operátory jsou navíc k těm v POSIX bc:

&&     ||      !

Jsou k dispozici pro použití v podmíněných příkazech (například v rámci if příkazu). Všimněte si však, že stále neexistují žádné ekvivalentní bitové operace nebo operace přiřazení.

Funkce

Všechny funkce dostupné v GNU bc jsou zděděny z POSIXu. Standardně nejsou s distribucí GNU poskytovány žádné další funkce.

Příklad kódu

Protože ^ operátor bc umožňuje pouze celočíselný výkon napravo, jednou z prvních funkcí, které uživatel bc může napsat, je výkonová funkce s exponentem s plovoucí desetinnou čárkou. Oba níže předpokládají, že byla zahrnuta standardní knihovna:

Funkce „power“ v POSIX bc

 /* A function to return the integer part of x */
 define i(x) {
    auto s
    s = scale
    scale = 0
    x /= 1   /* round x down */
    scale = s
    return (x)
 }

 /* Use the fact that x^y == e^(y*log(x)) */
 define p(x,y) {
    if (y == i(y)) {
       return (x ^ y)
    }
    return ( e( y * l(x) ) )
 }

Výpočet π na 10 000 číslic

Vypočítejte pomocí vestavěné arkustangensové funkce, a () :

$ bc -lq
scale=10000
4*a(1) # The atan of 1 is 45 degrees, which is pi/4 in radians.
       # This may take several minutes to calculate.

Přeložená funkce C.

Protože syntaxe bc je podobná syntaxi C , publikované číselné funkce napsané v C lze často snadno přeložit do bc, což okamžitě poskytuje libovolnou přesnost bc. Například v časopise Journal of Statistical Software (červenec 2004, svazek 11, vydání 5) publikoval George Marsaglia následující C kód pro kumulativní normální distribuci :

double Phi(double x)
{
    long double s=x,t=0,b=x,q=x*x,i=1;
    while(s!=t)
        s=(t=s)+(b*=q/(i+=2));
    return .5+s*exp(-.5*q-.91893853320467274178L);
}

S některými nezbytnými změnami, aby se přizpůsobila různá syntaxe bc, a uvědomění si, že konstanta "0.9189 ..." je ve skutečnosti log (2 * PI) / 2, lze to přeložit do následujícího kódu GNU bc:

define phi(x) {
    auto s,t,b,q,i,const
    s=x; t=0; b=x; q=x*x; i=1
    while(s!=t)
        s=(t=s)+(b*=q/(i+=2))
    const=0.5*l(8*a(1))   # 0.91893...
    return .5+s*e(-.5*q-const)
}

Používání bc ve skriptech prostředí

bc lze použít neinteraktivně se vstupem potrubím . To je užitečné uvnitř skriptů prostředí . Například:

$ result=$(echo "scale=2; 5 * 7 /3;" | bc)
$ echo $result
11.66

Naproti tomu si všimněte, že prostředí bash provádí pouze celočíselnou aritmetiku, např .:

$ result=$((5 * 7 /3))
$ echo $result
11

Lze také použít idiom zde-řetězce (v bash, ksh, csh):

$ bc -l <<< "5*7/3"
11.66666666666666666666

Viz také

Reference

externí odkazy