Login
Newsletter
Werbung

Mo, 16. Mai 2005, 00:00

Der Basic Calculator bc

Kleine Anpassungen für die tägliche Arbeit

Einführung

Der bc ist wohl der praktischste und schlankeste »Taschenrechner« für den Desktop (und die Konsole), der mir bisher untergekommen ist. Sein größter Vorteil ist sicher, dass er in der Konsole oder im Terminal läuft. Außerdem ist der bc unerhört anpassungsfähig. Naja, laut Manpage ist der bc ja auch ein Programmiersprachen-Rechner: »bc - An arbitrary precision calculator language« - das lässt etwa erahnen, wie mächtig das Teil ist. Hier eine kurze Beispielsitzung, die die m.E. wichtigsten Eigenschaften dieses Rechenknechts zeigt:

$ bc -l
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'. # Hier geht mein Dank an die FSF!
 # (Muss ja mal gesagt werden...)
1+1 # meine Eingabe
2 # Ausgabe
5+3^2 # Eingabe
14 # Ausgabe
sqrt(2) # Eingabe
1.41421356237309504880 # Ausgabe
a=3 # Eingabe
a+1 # Eingabe
4 # Ausgabe
define f(x) { return x+2 } # Eingabe: So einfach definiert man
 # Funktionen selbst...
f(3) # Eingabe: und so einfach
 # benutzt man sie...
5 # Ausgabe: und voila: sie funktionieren!

Gewöhnungsbedürftig ist sicher, dass der bc weder einen Eingabe- noch einen Ausgabeprompt hat. Also nach der Begrüßung einfach munter losrechnen! Sehr praktisch ist es auch, dass der bc sich an die Eingaben erinnert: Wie in der Shell kann man mit den Pfeiltasten (auf und ab) die zurückliegenden Eingaben zurückholen und editieren.

Komma als Dezimalkomma

Kurz gesagt, bc ist mein bevorzugter Rechenknecht für alle numerischen Berechnungen im Terminal. Einziger Wermutstropfen: bc interpretiert das Komma im Nummernblock als Komma, aber eben nicht als Dezimalkomma. Daher habe ich eine Lösung gesucht, bc das Komma im Nummernblock als Dezimalpunkt beizubringen. Und weil mich diese Lösung einigen Schweiß gekostet hat, möchte ich sie hier vorstellen in der Hoffnung, dass sie auch für andere nützlich ist.

Die Lösung meines Problems war der Befehl xmodmap: Dieses Programm kann die aktuelle Tastaturbelegung (und noch einiges anderes) unter X anzeigen und verändern. Der Befehl

xmodmap -e "keycode 91 = period"

belegt das Komma aus dem Nummernblock mit dem Dezimalpunkt. Da aber für andere Programme wie Tabellenkalkulation das Komma ein Komma sein sollte, muss nach der Benutzung von bc der Urzustand wieder hergestellt werden mit

xmodmap -e "keycode 91 = KP_Delete KP_Separator"

(Natürlich funktioniert diese Lösung nur unter X.) Um nicht vor und nach jeder Benutzung von bc lange xmodmap-Befehle aufrufen zu müssen, kann man den Aufruf von bc mit den beiden xmodmap-Aufrufen verknüpfen:

xmodmap -e "keycode 91 = period" && bc -l; xmodmap -e "keycode 91 =
KP_Delete KP_Separator"

Durch die &&-Verknüpfung wird der bc nur aufgerufen, wenn die Belegung des Nummernblock-Kommas mit dem Dezimalpunkt erfolgreich war. durch die ";"-Verknüpfung nach dem bc-Aufruf wird sichergestellt, dass die veränderte Tastenbelegung in jedem Fall rückgängig gemacht wird, also auch, wenn der bc mit einem Fehler beendet wurde.

Es kann sicher nicht schaden, einen Blick in die eigene, aktuelle Tastenbelegung zu werfen:

xmodmap -pke | less

gibt alle Details der Tastenbelegung preis.

Mathematik

Mit der Option -l beim Aufruf von bc wird eine math library eingebunden, die die folgenden grundlegenden Funktionen bereitstellt: Sinus s(x), Cosinus c(x) (beide im Bogenmaß), Arcustangens a(x), die Exponentialfunktion e(x) und den natürlichen Logarithmus l(x) sowie die Quadratwurzel sqrt(x) (und außerdem noch die Besselfunktion). Schließlich fehlte mir noch die Konstante Pi. Um Pi beim Aufruf von bc parat zu haben, kann man sich z.B. die Datei .bcrc im Homeverzeichnis anlegen:

cat > ~/.bcrc
Pi=4*a(x)

Natürlich kann man noch weitere Funktionen oder Konstanten in dieser Datei festlegen. Nützlich ist etwa die Betragsfunktion:

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

Außerdem berechnet bc nur Potenzen mit ganzzahligen Exponenten. Bei der Berechnung von 3^2.55 hilft die Funktion hoch(a,b):

define hoch(a,b) { if (a>0) return e(b*l(a)); print "Fehler..." }

Diese (oder andere) Funktionen trägt man einfach als Zeilen in die Datei .bcrc ein. Damit bc die Datei beim Start einliest, übergibt man in gewohnter Weise den Dateinamen als Argument:

bc -l ~/.bcrc

Auf diese Weise habe ich einen bc nach meinen Bedürfnissen. Deshalb habe ich mir die Befehlszeile als Alias in meine .bashrc gelegt (das muß in einer einzigen Zeile stehen):

alias Rechner='xmodmap -e "keycode 91 = period" && bc -l;
xmodmap -e "keycode 91 = KP_Delete KP_Separator"'

Und nun noch ein Wort zur Genauigkeit von bc. bc rechnet immer nur mit einer endlichen Zahl von Stellen, die durch die Variable scale festgelegt wird. So liefert etwa

3*(1/3)
.99999999999999999999

Besonders fällt das bei der oben beschriebenen Funktion hoch(a,b) auf:

hoch(10,1)
9.99999999999999999992
hoch(10,8)
99999999.99999999999360683625

Da bc beim Aufruf mit der math-library jedoch bereits mit 20 Nachkommastellen rechnet (und mit der Einstellung scale=50 auch mit 50 Nachkommastellen), lässt sich das sicher verschmerzen. Die Abweichung vom richtigen Ergebnis fällt natürlich deshalb besonders auf, weil bc immer alle Nachkommastellen angibt. Berücksichtigt man nur die üblichen zehn signifikanten Stellen, so schneidet bc sicher nicht schlechter ab als gängige Taschenrechner.

Ausblick

In diesem Artikel habe ich (fast) nur die Benutzung von bc als interaktiven Rechner beschrieben. Darauf möchte ich mich beschränken und nur darauf hinweisen, dass man bc auch zur Verarbeitung von Skripten nutzen kann. Dafür bietet bc neben dem schon benutzten IF...ELSE weitere Kontrollstrukturen wie FOR- und WHILE-Schleifen und andere grundlegende Infrastrukturen einer Skriptsprache. Aber das sagte ja schon die Manpage: »bc - An arbitrary precision calculator language«. Vielleicht schreibt ja jemand anderes darüber noch mal einen ausführlichen Artikel...

An dieser Stelle noch ausdrücklich mein Dank an die Pro-Linux-Redaktion für ihre großartige Arbeit!

Quellen

man bc/info bc
man xmodmap (gab es auf meinem SuSE 9.1 nicht :-( hier ist sie online: http://dc.qut.edu.au/cgi-bin/man/man2html?1+xmodmap)
http://www.linux-user.de/ausgabe/2002/06/074-answergirl/answergirl.html

Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung