bc (programovací jazyk) - bc (programming language)
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)...
if
else
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 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 pí 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
- The Single UNIX Specification , Issue 7 from The Open Group : aritmetický jazyk s libovolnou přesností - Commands & Utilities Reference,
- Ruční stránka GNU bc
- Ruční stránka POSIX bc
- Plan 9 Programmer's Manual, Volume 1 -
- Ruční stránka Unixu bc 7. vydání
- Článek comp.compilers o designu a implementaci C-bc
- 6. vydání Unix bc zdrojový kód , první vydání bc, od května 1975, kompilace bc syntaxe do syntaxe dc
- bc zdrojový kód
externí odkazy
- Dittmer, I. 1993. Chyba v Unixových příkazech dc a bc pro aritmetiku s větší přesností. SIGNUM Newsl. 28, 2 (duben 1993), 8–11.
- Sbírka užitečných funkcí GNU bc
- GNU bc (a alfa verze ) od Free Software Foundation
- bc pro Windows od GnuWin32
- Gavin Howard bc - další open source implementace bc od Gavina Howarda s příponami GNU a BSD
-
X-bc - grafické uživatelské rozhraní pro bc
- extensions.bc - obsahuje funkce trigonometrie, exponenciální funkce, funkce teorie čísel a některé matematické konstanty
- Scientific_constants.bc - obsahuje hmotnosti částic, základní konstanty, jako je rychlost světla ve vakuu a gravitační konstanta