bc (Unix)

bc (kurz für basic calculator) ist eine numerische Programmiersprache, die an die Syntax von C angelehnt ist, sowie ein durch den POSIX-Standard genormter Interpreter, der diese Programmiersprache implementiert und dessen Vorhandensein in dem standardkonformen Betriebssystemen vorgeschrieben ist. Das herausstellende Merkmal von bc ist die Fähigkeit, mit Gleitkommazahlen (fast) beliebig großer Genauigkeit zu rechnen; die Grenze liegt je nach Version bei mindestens mehreren tausend Stellen, meist aber bei mehreren Millionen bis Milliarden. Die ersten Versionen wurden von Lorinda Cherry bei den Bell Labs entwickelt.

Arbeitsweise

Der Interpreter folgt, vom POSIX-Standard so festgelegt,[1] den üblichen Anforderungen an Utilities, den sogenannten Utility Syntax Guidelines.[2] Als Eingabe werden entweder (Text-)Dateien oder Input auf <stdin> erwartet. Ziel der Ausgabe ist in jedem Fall <stdout>, Fehlermeldungen gehen nach <stderr>.

bc verwendet keine eventuell verfügbaren Gleitkommaeinheiten eines Rechners, sondern arbeitet intern nur mit Integers; die Gleitkommafähigkeit wird per Software hergestellt. Nur so kann die Sprache diese hohen und von verfügbarer Hardware unabhängigen Genauigkeiten erreichen. Allerdings ist bc damit auch prinzipbedingt wesentlich langsamer als Software, die diese Einrichtungen benutzt.

Nicht nur die zu erzielende Rechengenauigkeit kann festgelegt werden, bc ist in der Lage, mit beliebigen (Zahlen-)Basen zu arbeiten und diese ineinander umzurechnen. Bis zur Basis 16 wird die übliche Schreibweise verwendet und Ziffern jenseits der 9 durch die Buchstaben A bis F dargestellt. Die Ziffern in Basen größer 16 werden hingegen als aus mehreren (dezimalen) Einzelziffern bestehende Zahlen dargestellt, die durch ein Trennzeichen (meist ein Blank) getrennt sind. Dabei werden für die Basen 17-100 zweistellige, für die Basen 101-1000 dreistellige Dezimalzahlen und so fort verwendet. Siehe auch die Anwendungsbeispiele weiter unten.

Die von POSIX standardisierte bc-Sprache ist in ihrer Struktur an C angelehnt und in demselben Dokument ebenfalls (in Form einer LL1-Grammatik) festgelegt (unter Extended Description).[1] Von Haus aus enthält bc nur einige Grundfunktionen wie etwa die Exponentialfunktion, die trigonometrischen Funktionen und den natürlichen Logarithmus. Es können jedoch weitere Funktionen selbst definiert werden.

Varianten

GNU bc

GNU-bc ist ein Nachbau von POSIX-bc, weist allerdings gegenüber dem Standard zahlreiche Änderungen auf. Es ist, anders als manche sonstigen Varianten, von Grund auf in C geschrieben und baut nicht auf dc auf. Die GNU-Variante erweitert die POSIX-Variante um zusätzliche Funktionen.

Zu den Unterschieden zählen erweiterte Möglichkeiten zur Benennung von Variablen, Arrays und Funktionen, eine erweiterte if-Anweisung und anderes.

Beispiele

Die folgenden Beispiele sind mit einem POSIX-bc unter AIX (Version 7.1.5, TL 1) erzeugt. Ausgaben sind im Folgenden fett gesetzt:

Berechnungen

Dieses Beispiel zeigt, wie erst eine Funktion definiert wird, die nonrekursiv die Fakultät errechnet. Danach wird diese Funktion aufgerufen um 10! auszugeben. Das Beispiel ist der man page für bc unter AIX entnommen.

user@system $ bc
define f(n) {
auto i, r;
r = 1;
for (i=2; i<=n; i++) r *= i;
return (r);
}
f(10)
3628800

Wechsel und Umrechnung verschiedener Basen

bc unterscheidet zwischen der Basis für die Eingabe (ibase) und die Ausgabe (obase). Etwa lautet die Darstellung der Zahl 1024 (dezimal) zu den Basen 25 und 125:

user@system $ bc
obase=25
1024
 01 15 24
obase=125
1024
 008 024

Weblinks

Einzelnachweise

  1. a b bc-Spezifikation des POSIX-Standards. Abgerufen am 25. April 2019 (englisch).
  2. Utility Syntax Guidelines. Abgerufen am 25. April 2019 (englisch).