Dr. Luthardt's Chemieseiten 

weiter


Valid HTML 4.01!Achtung Ein direkter Aufruf des Validators ist von https-Seiten aus nicht möglich. Hier muss die zu prüfende Seite händisch auf der Validator-Seite eingeben werden.
Valid CSS!Achtung Ein direkter Aufruf des Validators ist von https-Seiten aus nicht möglich. Hier muss die zu prüfende Seite händisch auf der Validator-Seite eingeben werden.

last modified
18.04.2024

Ihr Browser unterstützt kein CSS. Das für die Darstellung dieser Webseiten intendierte Seitenlayout wird deshalb nicht angewandt / angezeigt. Ist dies nicht Ihre Absicht, so haben Sie wahrscheinlich in Ihrem Browser den Autorenmodus deaktiviert. Dennoch sind diese Seiten les- und navigierbar.
Texte der Infoboxen werden inline ausgegeben.
Bitte erlauben Sie den Autorenmodus oder verwenden Sie einen CSS-fähigen Browser, wenn Sie diese Seiten so anschauen möchten, wie sie vom Autor gestaltet wurden.

Tipps und Tricks

von Michael Luthardtauthor: Michael Luthardt

Rechnen mit und in der bash shell

Für gelegentlich notwendige Berechnungen wird meist ein grafisches Programm wie gnome-calculator benutzt. Dabei ließe sich vieles in einem Terminalfenster schneller erledigen – mit einem nicht grafischen Server ohnehin die einzige Möglichkeit.

Die bash selbst kann nur wenig rechnen, kennt keine Gleitkommaarithmetik und die Eingabe ist mit echo $((expr)) recht umständlich. Einen Überblick gibt die man-page der bash.

Ab und an findet sich der Tipp, zum Gleitkommarechnen GNU gawk z. B. als Funktion function calc { awk "BEGIN {print $*}"; } zu benutzen. Der Aufruf wäre dann calc expr. Über die Rechenmöglichkeiten von awk gibt ebenfalls dessen man-page Auskunft.

Dies und andere Konstrukte sind aber gar nicht nowendig, den zu Linux gehört schon immer das Unix-Programm bcbasic calculator.
GNU bc ist nicht einfach nur ein Programm, sondern eine eigene, einfache Programmsprache, die Berechnungen beliebiger Genauigkeit und interaktives Arbeiten ermöglicht. Im Zeitalter von GUI-Tools und Tabellenkalkulationsprogrammen1 scheint es für Desktop-Benutzer ziemlich vergessen – zu Unrecht. Es ist die einzige Möglichkeit für Desktopbenutzer, unkompliziert mit einer wesentlich höheren Rechengenauigkeit zu arbeiten, ohne spezielle Mathematikprogramme installieren zu müssen. Maximal sind in GNU bc 65535 Stellen möglich.

Die Rechengenauigkeit wird erreicht, weil – vereinfacht ausgedrückt – bc intern nicht mit Dualzahlen, auf dem PC 64 bit nach IEEE 754 (double), sondern mit "richtigen" Dezimalzahlen so rechnet, wie wir es mit Papier und Bleistift tun. Dadurch ist die Anzahl der gültigen Ziffern (fast) nicht begrenzt.
Differenzen mit 0,1, die für Dualzahlen periodische Dualbrüche sind und z. B. in Tabellenkalkulationen problematisch sein können, sind deshalb für bc kein Thema. Andererseits bleibt für bc ⅓+⅓+⅓ immer 0,999..., wie genau ich auch rechne.2

HowTo's und Tutorials zu bc findet man genug im Internet3, das soll hier nicht wiederholt werden. Die man-page ist ebenso ein guter Einstieg.

Mit dem Aufruf von bc gelangt man in den interaktiven Modus. Möchte man einzelne Berechnungen direkt in der shell durchführen, müssen bc die Argumente über eine Pipe übergeben werden. Die einfachste Möglichkeit hierzu ist ein here string <<< expr. Der here string ist in der bash relativ neu und wird in den Tutorials selten benutzt. Natürlich kann man auch beim hergebrachten echo "…" | bleiben.

Für den Zugriff auf die eingebauten mathematischen Funktionen (standard library functions) ruft man bc mit dem Parameter -l auf. Eine weitere praktische Möglichkeit ist, eigene Funktionen (sog. extensions) in einer Textdatei zu speichern und bei jedem Aufruf einzulesen.
Für die next Berechnung von Molmassen gibt es die relativen Atommassen als bc-Erweiterung unter Downloads, ebenso Programme zur next pH-Berechnung, letztere auch in Verbindung mit einer einfachen Ein- und Ausgabe über eine grafische Benutzeroberfläche.
Verwendet man Klammern, so muss der here string in Hochkomma eingeschlossen werden; ein Beispiel ist bc -lq extensions.bc <<< 'sin(.2)'

Achtung Ein einfacher Aufruf wie bc 3/4 liefert als Ergebnis 0 und nicht das Gleitkommaergebnis 0,75. Erst mit dem Aufruf der standard library functions oder einer expliziten Genauigkeitsangabe (scale= ) kommt man zur Ausgabe des Resultats als Gleitkommazahl. Andereseits läßt sich dies für Rechentricks auf der shell und in shell-Skripten nutzen. Einige Beispiele:
bc <<< 5.78/1 liefert 5 als den ganzzahligen Teil, natürlich kann sich die Zahl auch in einer Variblen befinden.
bc <<< "(5.78+.5)/1" rundet auf 6,
bc <<< "scale=1; (5.78+.05)*10/10" rundet auf 5,8.
bc <<< "($(du -s 2>/dev/null | cut -f1)+5)/10*10" rundet die Ausgabe von du -s auf ganze Zehner.

Für häufiges Rechnen mit bc definiert man sich zweckmäßig in seiner .bashrc eine Funktion

function ca() {
   xmodmap -e "keycode 91 = period period"
   bc -lq .bcrc $@
   xmodmap -e "keycode 91 = KP_Delete KP_Separator"
}

Your browser does not support objects, but you may view this content here.
In einer Resource-Datei, zum Beispiel .bcrc (rechts, ebenfalls unter Downloads) speichert man oft benötigten Funktionen. Durch den Sammelparamter $@ lassen sich ca weitere bc-Dateien übergeben, z. B. ca atwt.bc. Man muss nur daran denken, dass sich Definitionen in der Reihenfolge ihres Aufrufs überschreiben.

Meine .bcrc enthält π, e, Betrag (abs), Vorzeichen (sig), Ganzzahl (int), Beseitigung nachlaufender Nullen (trunc), Runden (round) auf Stellen nach und vor dem Komma, bx (pow) für nicht ganzzahlige Exponenten, die Winkelfunktionen sin, cos, tan, cot, asin, acos, atan, acot, die Logarithmen ln, lg, die Fakultät (fac) n! für natürliche Zahlen und eine grobe Näherung über die Stirlingsche Formel für die Γ-Funktion (g(x), x ≥ 0) und das Collatz-Problem (coll) für eine vorgebbare Zahl von Iterationen.
Letzteres zeigt die Geschwindigkeit von bc: coll(100000000057,530) benötigt 12 ms CPU-Zeit (Intel core i7).

Neue – z. B. sin – und an sich vorhandene Funktionen wie l als ln sind so geschrieben, dass Laufzeitfehler abgefangen und Ergebnisse mit einer korrekten Rundung und ohne nachlaufende Nullen zurück geliefert werden. Damit ergibt sich z. B. korrekt ln(e)=1. Nach Berechnung von π und e auf 200 Nachkommastellen und Definition der Funktionen wird die Zahl der Nachkommastellen (scale) auf 8 gesetzt.
Die eingebauten Funktionen e() und a() liefern mit scale=2000 ihre Funktionswerte auf 1999 bzw. 1997 Stellen in Übereinstimmung mit tabellierten Werten zurück.4.

xmodmap ändert das Komma im numerischen Ziffernblock auf den Punkt und nach Beendigung von bc wieder zurück. Das ist beim Arbeiten mit bc ungemein praktisch. Für ein Notebook sollten diese Zeilen natürlich entfernt werden. Bei Anwendung von xmodmap überprüfen Sie bitte die Zuordnung für ihr Keyboard.

Ein Tipp für das interaktive Arbeiten: Das letzte Resultat wird automatisch in der Variablen last gespeichert, für die auch der . benutzt werden kann, z. B.

foo@bar:~$ bc -lq extensions.bc
sin(.2)
.19866933079506121545
.*2
.39733866159012243090

Auch der Gnome-Taschenrechner gnome-calculator läßt sich auf der Kommandozeile verwenden. Er hat ebenfalls eine höhere Rechengenauigkeit als die Tabellenkalkulation. gnome-calculator kennt einige der mathematischen Sonderzeichen aus dem next Unicode-Zeichensatz, z. B.:

foo@bar:~$ gnome-calculator -s ∜16
2
foo@bar:~$ gnome-calculator -s 2⁻³
0,125

           
1 1) Man ist bedeutend schneller auf einer Konsole als in einer Tabellenkalkulation und 2) Tabellenkalkulationen arbeiten intern mit einer begrenzten Weiter Rechengenauigkeit.
2 Die wesentlich ungenauere Tabellenklakulation liefert als Ergebnis 1, weil dort die Darstellung solcher Ergenisse optimiert wird.
3 bc – an arbitrary precision calculator language, bc programming language (Wikipedia) und insbesondere die sehr umfangreiche Seite GNU bc von phodd.
4 Benötigt man π und e mit höherer Genauigkeit als in der .bcrc berechnet, so muss man scale heraufsetzen und 4*a(1) und e(1) benutzen. Ab scale=2000 wird der Mehrbedarf an Rechenzeit spürbar, so dass ich genauere Resultate nicht überprüft habe.

24.4.2009/12.02.2024

 nach oben

Änderungen dieser Seite verfolgen:

it's private by ChangeDetection