bc – An arbitrary precision calculator language

Der Basic Calculator (bc) ist ein Kommandozeilenprogramm das unter anderem die Funktionalität eines Taschenrechners bietet. Vorteile sind beispielsweise die (fast) beliebige Genauigkeit und die Möglichkeit Funktionen und Konstanten zu definieren und den bc so den eigenen Bedürfnissen anzupassen. Ich werde hier auf ein paar Grundfunktionen eingehen.

Die Installation kann über den jeweiligen Paketmanager der Distribution erfolgen, bei Gentoo per:

emerge sys-devel/bc
Man kann bc auch direkt aus den Quellen übersetzen ( ftp://ftp.gnu.org/gnu/bc ).

Der Kommandozeilenaufruf erfolgt dann einfach per
bc

Im Programm hat man nun die Möglichkeit gewisse Grundrechenarten und einfache Funktionen zu nutzen, sowie Einstellungen am Verhalten von bc vorzunehmen (teilweise muss dazu bc mit ‘-l’ gestartet werden).

  • scale gibt die Anzahl der zu berechnenden Nachkommastellen an.
  • s(x) gibt den Sinus des Eingabewertes x zurück
  • c(x) gibt den Cosinus des Eingabewertes x zurück
  • a(x) gibt den Arcustangens des Eingabewertes x zurück
  • e(x) wertet die E-Funktion an der Stelle x aus
  • l(x) wertet den Logarithmus Naturalis an der Stelle x aus
  • weiteres siehe man-page.

Nun zu Selbstdefinierten Funktionen. Eine Funktion in bc definiert man über das Schlüsselwort ‘define’. Eine Funktion muss einen Eingabewert und einen Namen besitzen, und muss natürlich einen Wert zurückgeben. Der Funktionsrumpf steht dabei in einem Block aus geschweiften Klammern.
Hier ein Beispiel:


define sin(x)
{
return s(x);
}

Diese Funktion Wertet s(x) aus und gibt es zurück. Damit haben wir also einen alias für die Sinus-Funktion geschrieben. Solche Funktionen können aber auch komplizierter ausfallen. Es lassen sich bestehende Konzepte wie for- und while-Schleifen sowie if-Abfragen und Variablen benutzen. Hier wieder ein Beispiel:


define abs(x)
{
if ( x > 0 ){ return x }
if ( x < 0 ){ return -x}
}

Damit haben wir die Funktion ‘abs’ definiert, die den Absolut-Betrag zurückgibt. Außer Funktionen lassen sich auch Konstanten definieren. Das sieht dann in etwa so aus:


temp=scale
scale=100
pi=4*a(1)
scale=temp

Damit definieren wir eine Konstante mit Namen “pi” die auf 100 Nachkommastellen genau der Kreiszahl pi (4* arcustangens(1) ) entspricht. Das sollte für die meisten Anwendungen reichen.

Ein Problem ist, daß bc sich eingegebene Funktionen und Konstanten nur für die dauer des Programmablaufes merkt, das heißt wenn man bc beendet (was im übrigen durch eingabe von ‘quit’ geschieht) und ihn neu aufruft, existieren die eingegebenen Funktionen und Konstanten nicht mehr. Auch der Wert von ‘scale’ ist dann zurückgesetzt. Abhilfe kann man sich schaffen indem man die Funktionen und Definitionen in eine Textdatei schreibt und diese beim Aufruf an bc per ‘-l’ übergibt.
Nützlich wäre hier ein alias in der ~/.bashrc.

Beispiel:

echo "scale = 100" > ~/.bc
echo "pi=4*a(1)" >> ~/.bc
echo "define sin(x){ return s(x) }" >> ~/.bc
echo "alias bc='bc -l ~/.bc'" >> ~/.bashrc

Damit würden die Definitionen bei jedem Start von bc eingelesen werden. Nun zum letzten Punkt auf den ich heute eingehen werde: Shell-Skripten mit bc.

Man kann an bc Rechenaufgaben ‘pipen’, also mittels Pipes von anderen Programmen dinge von bc ausrechnen lassen, an denen die Möglichkeiten der Shell scheitern würden:

echo "scale=10; 5+sqrt(7)*c(1)+100"|bc

Soviel für heute zum bc. Eventuell werde ich diesen Artikel noch ein wenig erweitern, falls interesse besteht.

0 thoughts on “bc – An arbitrary precision calculator language”

Leave a Reply

Your email address will not be published. Required fields are marked *