BC (Programmiersprache)

BC
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.

Die BC Standard Library[1]
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

  1. ^ a b BC: Schiedsrichter-Präzision Arithmetische Sprache-Shell and Utilities Referenz, Die einzelne Unix -Spezifikation, Version 4 von Die offene Gruppe

Externe Links