BC (Programmiersprache)
Entwickler (en) | Robert Morris und Lorinda Cherry von Bell Labs |
---|---|
Erstveröffentlichung | 1975, vor 46–47 Jahren |
Betriebssystem | Unix, Unix-artig, Plan 9, Freedos |
Plattform | Plattformübergreifend |
Typ | Befehl |
BC, zum Grundrechner (oft bezeichnet als als Bankrechner), ist "ein willkürliche Präzision Rechnersprache"Mit einer Syntax ähnlich dem C Programmiersprache. BC wird typischerweise entweder als mathematische Skriptsprache oder als interaktive mathematische Shell verwendet.
Überblick
Eine typische interaktive Verwendung ist die Eingabe des Befehls BC
auf einen Unix Eingabeaufforderung und in einen mathematischen Ausdruck eintreten, wie z. (1 + 3) * 2
, woraufhin 8 wird ausgegeben. Während BC mit willkürlicher Genauigkeit funktionieren kann, ist es nach dem Dezimalpunkt tatsächlich standardmäßig auf Null -Ziffern, so dass der Ausdruck so 2/3
ergibt 0 (Die Ergebnisse sind abgeschnitten, nicht abgerundet). Dies kann neue BC -Benutzer überraschen, die sich dieser Tatsache nicht bewusst sind. Das -l
Option zum BC legt den Standardwert fest Skala (Ziffern nach dem Dezimalpunkt) zu 20 und fügt der Sprache mehrere zusätzliche mathematische Funktionen hinzu.
Geschichte
BC erschien zuerst in Version 6 Unix 1975. wurde von geschrieben von Lorinda Cherry von Bell Labs als Frontend zu DC, ein willkürlicher Prezisionsrechner von von geschrieben von Robert Morris und Kirsche. DC führte beliebige Berechnungen durch, die in angegebenen Berechnungen durchgeführt wurden Polnische Notation umgekehrt. BC lieferte eine herkömmliche Programming-Sprachschnittstelle für die gleiche Fähigkeit über ein einfaches Compiler (ein einzelnes yacc Quelldatei mit einigen hundert Codezeilen), die a konvertierten C-ähnliche Syntax in DC -Notation und leitete Die Ergebnisse durch DC.
1991, Posix streng definiert und standardisiert BC. Drei Implementierungen dieses Standards überleben heute: Die erste ist die traditionelle Unix-Implementierung, ein Front-End-to-DC, das in UNIX und überlebt Plan 9 Systeme. Das zweite ist das gratis Software GNU BC, erstmals 1991 von Philip A. Nelson veröffentlicht. Die GNU-Implementierung hat zahlreiche Erweiterungen über den POSIX-Standard hinaus und ist kein Front-End für DC mehr (es ist a Bytecode Interpreter). Der dritte ist eine Neuauflagen von OpenBSD im Jahr 2003.
Implementierungen
POSIX BC
Die pox -standardisierte BC -Sprache wird traditionell als Programm in der geschrieben DC Programmiersprache, um ein höheres Maß an Zugriff auf die Merkmale der DC -Sprache ohne die Komplexität der knappen Syntax von DC zu gewährleisten.
In dieser Form enthält die BC-Sprache ein Buchstaben Variable, Array und Funktion Namen und die meisten Standard -arithmetischen Operatoren sowie die Vertrauten Kontrollfluss Konstrukte (if (cond) ...
, while (cond) ...
und für (init; cond; inc) ...
) von C. im Gegensatz zu C, a wenn
Klausel kann nicht von einem gefolgt werden anders
.
Funktionen werden mit a definiert definieren
Schlüsselwort und Werte werden von ihnen mit a zurückgegeben Rückkehr
gefolgt vom Rückgabewert in Klammern. Das Auto
Das Schlüsselwort (optional in C) wird verwendet, um eine Variable als lokal für eine Funktion zu deklarieren.
Alle Zahlen und variablen Inhalte sind willkürliche Präzision Zahlen, deren Präzision (an Dezimalstellen) durch die globale bestimmt wird Skala
Variable.
Das Numerische Basis der Eingabe (im interaktiven Modus) können Ausgabe- und Programmkonstanten angegeben werden Ibase
(Eingangsbasis) und Obase
(Ausgangsbasis) Variablen.
Die Ausgabe wird generiert, indem das Ergebnis einer Berechnung nicht einer Variablen zugewiesen wird.
Kommentare können dem BC -Code mithilfe des C addiert werden /*
und */
(Start und Ende Kommentar) Symbole.
Mathematische Operatoren
Genau wie c
Die folgenden Possix BC Betreiber Verhalten Sie sich genau wie ihre C -Kollegen:
+ - * / + = - = * = / = ++ - <> ==! = <=> = () [] {}
Ähnlich wie c
Das Modul Betreiber, %
und %=
Verhalten Sie sich genau wie ihre C -Kollegen nur dann, wenn die globale Skala
Die Variable wird auf 0 gesetzt, d. H. Alle Berechnungen sind nur ganzzahlig. Andernfalls erfolgt die Berechnung mit der entsprechenden Skala. a%b
ist definiert als a- (a/b)*b
. Beispiele:
$ BCBC 1.06 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. Dies ist eine kostenlose Software ohne Garantie. Für Details geben Sie "Garantie" ein. Skala = 0; 5%3 2 Skala = 1; 5%3 .2 Skala = 20; 5%3 .000000000000000002
Widersprüchlich mit c
Die Betreiber
^ ^ =
oberflächlich ähneln dem b -bitweisen C Exklusiv oder Betreiber, aber tatsächlich sind die Exponentiationsbetreiber der BC -Ganzzahl.
Besonders beachten die Verwendung der Verwendung der ^
Der Bediener mit negativen Zahlen folgt nicht dem C -Operator -Vorrang. -2^2
Gibt die Antwort von 4 unter BC anstelle –4.
"Fehlende" Operatoren im Vergleich zu C.
Das bitweise, Boolesche und bedingt Operatoren:
& | ^ && || & = | = ^= && = || = << >> << = >> =?:
sind in POSIX BC nicht erhältlich.
Integrierte Funktionen
Das sqrt ()
Funktion zur Berechnung Quadratwurzeln ist POSIX BCs einzige eingebaute mathematische Funktion. Andere Funktionen sind in einer externen Standardbibliothek erhältlich.
Das Skala()
Funktion zur Bestimmung der Präzision (wie mit dem Skala
Variable) seiner Argumentation und der Länge()
Die Funktion zur Bestimmung der Anzahl der signifikanten Dezimalstellen in ihrem Argument ist ebenfalls eingebaut.
Standardbibliotheksfunktionen
BCs Standard -Mathematikbibliothek (definiert mit dem -l Option) enthält Funktionen für die Berechnung Sinus, Kosinus, Arctangent, Natürlicher Logarithmus, das Exponentialfunktion und die beiden Parameter Bessel -Funktion J. Die meisten mathematischen Standardfunktionen (einschließlich der anderen inversen trigonometrischen Funktionen) können mit diesen konstruiert werden. Siehe externe Links für die Implementierung vieler anderer Funktionen.
BC -Befehl | Funktion | Beschreibung |
---|---|---|
s (x) | Sinus | Nimmt xein Winkel in Radians |
C (x) | Kosinus | Nimmt x, ein Winkel in Radians |
Axt) | Arctangent | Gibt Radians zurück |
l (x) | Natürlicher Logarithmus | |
ex) | Exponentialfunktion | |
J (n, x) | Bessel -Funktion | Gibt die Bestellung zurück.n Bessel -Funktion von x. |
Das -l Option ändert die Skala auf 20,[1] Dinge wie Modulo können also unerwartet funktionieren. Zum Beispiel Schreiben bc -l
und dann der Befehl Drucken 3%2
Ausgänge 0. aber schreiben Skala = 0
nach bc -l
und dann der Befehl Drucken 3%2
Wird Ausgabe 1.
Plan 9 v. Chr
Plan 9 BC ist identisch mit POSIX BC, aber für eine zusätzliche drucken
Aussage.
GNU BC
GNU BC stammt aus dem POSIX -Standard und enthält viele Verbesserungen. Es ist vollständig von DC-basierten Implementierungen des POSIX-Standards getrennt und ist stattdessen in C geschrieben. Dennoch ist es vollständig rückwärts kompatibel, da alle POSIX-BC-Programme als GNU-BC-Programme unmodifiziert werden.
GNU -BC -Variablen, -Arrays und Funktionsnamen können mehr als ein Zeichen enthalten, einige mehr Operatoren wurden aus C und insbesondere A aufgenommen wenn
Klausel kann von einem folgen anders
.
Die Ausgabe wird entweder erreicht, indem nicht absichtlich kein Ergebnis einer Berechnung einer Variablen (posix) oder durch Verwendung der hinzugefügten Verwendung zugewiesen wird drucken
Aussage.
Außerdem a lesen
Die Anweisung ermöglicht die interaktive Eingabe einer Zahl in eine laufende Berechnung.
Zusätzlich zu den Kommentaren im C-Stil ist a #
Der Charakter verursacht alles danach, bis die nächste neue Linie ignoriert wird.
Der Wert der letzten Berechnung wird immer innerhalb des zusätzlichen Eingebauten gespeichert letzte
Variable.
Zusätzliche Betreiber
Folgende logische Operatoren sind zusätzlich zu denen in POSIX BC:
&& || !
Sie stehen zur Verwendung in bedingten Aussagen zur Verfügung (z. B. innerhalb eines wenn
Aussage). Beachten Sie jedoch, dass es immer noch keine äquivalenten Bitgewise- oder Zuordnungsvorgänge gibt.
Funktionen
Alle in GNU BC erhältlichen Funktionen werden von POSIX geerbt. Mit der GNU -Verteilung werden keine weiteren Funktionen als Standard bereitgestellt.
Beispielcode
Seit dem BC ^
Der Bediener ermöglicht nur eine Ganzzahlleistung rechts. Eine der ersten Funktionen, die ein BC-Benutzer schreiben könnte, ist eine Leistungsfunktion mit einem Gleitkomma-Exponenten. Beide unten gehen davon aus, dass die Standardbibliothek enthalten ist:
Eine "Power" -Funktion in POSIX BC
/ * Eine Funktion, um den Ganzzahlteil von x */zurückzugeben definieren i(x) { Auto s s = Skala Skala = 0 x /= 1 / * rund x down */ Skala = s Rückkehr (x) } /*Verwenden Sie die Tatsache, dass x^y == e^(y*log (x))*/// definieren p(x,y) { wenn (y == i(y)) { Rückkehr (x ^ y) } Rückkehr ( e( y * l(x) ) ) }
Berechnung von π bis 10000 Ziffern
Berechnung Pi mit dem gebauten Arctangent Funktion, a():
$ BC -LQSkala = 10000 4*a (1) # Der Atan von 1 beträgt 45 Grad, was PI/4 in Radians ist. # Die Berechnung kann einige Minuten dauern.
Eine übersetzte C -Funktion
Weil die Syntax von BC der von ähnlich ist C, veröffentlichte numerische Funktionen, die in C geschrieben wurden, können oft ganz einfach in BC übersetzt werden, was sofort die willkürliche Präzision von BC liefert. Zum Beispiel in der Journal of Statistical Software (Juli 2004, Band 11, Ausgabe 5), George Marsaglia veröffentlichte den folgenden C -Code für die kumulative Normalverteilung:
doppelt Phi(doppelt x) { lang doppelt s=x,t=0,b=x,q=x*x,i=1; während(s! =t) s=(t=s)+(b*=q/(i+=2)); Rückkehr .5+s*Exp(-.5*q-.91893853320467274178l); }
Mit einigen notwendigen Änderungen, um BCs unterschiedliche Syntax aufzunehmen und zu erkennen, dass die konstante "0,9189 ..." tatsächlich log (2*pi)/2 ist, kann dies in den folgenden GNU -BC -Code übersetzt werden:
definieren Phi(x) { Auto s,t,b,q,i,const s=x; t=0; b=x; q=x*x; i=1 während(s! =t) s=(t=s)+(b*=q/(i+=2)) Const=0,5*l(8*a(1)) # 0,91893... Rückkehr .5+s*e(-.5*q-Const) }
Verwenden von BC in Shell -Skripten
BC kann nicht-interaktiv mit Eingabe durch a verwendet werden Rohr. Dies ist nützlich im Inneren Shell -Skripte. Zum Beispiel:
$ Ergebnis=$ (Echo "Skala = 2; 5 * 7/3;" | BC) $ Echo $ Ergebnis 11.66
Beachten Sie dagegen, dass die Bash Shell führt nur eine ganzzahlige Arithmetik durch, z. B.::
$ Ergebnis=$ (((5 * 7 /3)) $ Echo $ Ergebnis 11
Man kann auch die verwenden hier-saiten Idiom (in Bash, KSH, CSH):
$ bc -l <<< "5*7/3" 11.66666666666666666666
Siehe auch
Verweise
- ^ a b Die einzelne Unix -Spezifikation, Version 4 von Die offene Gruppe : Schiedsrichter-Präzision Arithmetische Sprache-Shell and Utilities Referenz,
- Die einzelne Unix -Spezifikation, Version 4 von Die offene Gruppe : Schiedsrichter-Präzision Arithmetische Sprache-Shell and Utilities Referenz,
- GNU BC Manual Page
- POSIX BC Manual Page
- Plan 9 Programmierhandbuch, Volume 1 - -
- 7. Ausgabe Unix BC Manual Page
- Ein Artikel über comp.comPilers über die Gestaltung und Implementierung von C-BC
- 6. Ausgabe Unix BC Quellcode, Die erste Veröffentlichung von BC ab Mai 1975, Zusammenstellung der BC -Syntax in die DC -Syntax
- GNU BC -Quellcode
Externe Links
- Dittmer, I. 1993. Fehler in den UNIX-Befehlen DC und BC für Mehrfachprezisions-Arithmetik. Signum Newsl. 28, 2 (April 1993), 8–11.
- Sammlung nützlicher GNU -BC -Funktionen
- GNU BC (und ein Alpha -Version) aus der Free Software Foundation
- BC für Windows aus Gnuwin32
- Gavin Howard BC - Eine weitere Open -Source -Implementierung von BC von Gavin Howard mit GNU- und BSD -Erweiterungen
- X-BC - Eine grafische Benutzeroberfläche zu BC
- extensions.bc - Enthält Funktionen der Trigonometrie, Exponentialfunktionen, Funktionen der Zahlentheorie und einigen mathematischen Konstanten
- Scientific_constants.bc - Enthält Partikelmassen, Grundkonstanten wie Lichtgeschwindigkeit im Vakuum und die Gravitationskonstante