Mit Spigot auf der Kommandozeile rechnen

Aus LinuxUser 04/2017

Mit Spigot auf der Kommandozeile rechnen

© Slawomir Chomik, 123RF

Scharf kalkuliert

Der Rechner Spigot zeichnet sich durch hohe Genauigkeit aus. Mit diesem Tool erzielen Sie in der Shell höchst präzise Resultate.

Während der Befehl bc für viele eine bekannte Größe darstellt, mangelt es dem Konkurrenten Spigot noch an Bekanntheit. Nach kurzem Studium des Handbuchs und dem Abarbeiten einiger Beispiele arbeitet es sich mit dem Tool jedoch sehr unkompliziert. Seinen Namen borgt das Programm bei dem bekannten Algorithmus zum Berechnen mathematischer Konstanten. Allerdings gibt es noch andere, ebenso benannte Programme – hier droht Verwechslungsgefahr. Die Software stammt aus der Feder von Simon Tatham [1].

Laden Sie das aktuelle Quellpaket [2] herunter, entpacken Sie es, und wechseln Sie ins dabei angelegte Verzeichnis. Mit ./configure erstellen Sie das für das Kompilieren wichtige Makefile. Treten dabei Fehler auf, installieren Sie die als fehlend angemerkten Ressourcen mit dem Paketmanagement nach. Anschließend erstellen Sie das lauffähige Programm durch die Eingabe von make. Mit den notwendigen Rechten (als Benutzer root oder mit dem Befehl su) verschieben Sie Programm und Komponenten ins Zielverzeichnis, indem Sie make install in das Terminal eingeben.

Um die Installation zu testen, geben Sie im Terminal spigot 1+2 ein. Wenn Sie hier das korrekte Ergebnis erhalten, hat die Installation funktioniert. Online [3] finden Sie ein Handbuch, das Sie in die Arbeit mit der Software einführt.

Allgemeines

Eine Spezialität des Tools besteht in der mehr oder weniger unendlichen Darstellungstiefe von Zahlen. Geben Sie probehalber spigot pi am Terminal ein: Die Ausgabe der Kreiszahl läuft und läuft, bis Sie [Strg]+[C] drücken.

Um negative Eingabewerte von Optionen und Befehlen zu unterscheiden, bringen Sie Ihre Rechenaufgabe in Hochkommas und Klammern unter (Abbildung 1). Bei positiven Zahlen können Sie sich das schenken. Spätestens aber bei umfangreicheren Aktionen sollten Sie stets die Aufgabe in Hochkommas setzen, schon um die Shell nicht zu verwirren. Für den Einsatz von Variablen gilt: Wegen der Shell müssen Sie sogar die Klammern entwerten.

Abbildung 1: Bei der Eingabe gilt es, die korrekte Schreibweise von positiven und negativen Zahlen zu beachten.

Abbildung 1: Bei der Eingabe gilt es, die korrekte Schreibweise von positiven und negativen Zahlen zu beachten.

Für die tägliche Arbeit gilt es, die Stellen von Ergebnissen zu begrenzen und zu runden. Im ersten Schritt legen Sie die Genauigkeit mit -dStellen an. Das schneidet die Werte ab, rundet sie aber nicht. Die Art des Rundens bestimmt ein eigener Parameter. Die wichtigsten Optionen von Spigot fasst die Tabelle “Wichtige Parameter” zusammen, Abbildung 2 zeigt einige Beispiele.

Abbildung 2: Das Runden von Zahlen gehört zu den Standardoperationen von Spigot.

Abbildung 2: Das Runden von Zahlen gehört zu den Standardoperationen von Spigot.

Parameter

Hinweis

-dZahl

Stellenzahl begrenzen, kein Runden

--rn

Auf- und Abrunden

--ri

Runden, stets von null weg

--rz

Runden, stets Richtung null

--ru

Aufrunden, zum Positiven

--rd

Abrunden, zum Negativen

% oder mod

Rest (Modulo)

^, **

Potenzen

'let Variable=Wert'

Variable definieren

--printf

Zahlen formatieren

-b Basis

Zahlensysteme umrechnen

Um die Ausgabe in ein bestimmtes Format zu bringen, setzen Sie ans Ende der Eingabe die passende Printf-Anweisung. Mit man printf erfahren Sie mehr über die Operatoren. Die mathematischen Funktionen von Spigot, wie etwa Wurzel (sqrt), entsprechen den bekannten Schlüsselwörtern diverser Programmiersprachen. Es gilt Punkt vor Strich.

Genau wie Bc funktioniert auch Spigot nicht in einer Pipe. Vielmehr teilen Sie dem Programm mit, auf welchem Eingabekanal und mit welcher Basis es einen Wert entgegennimmt. Das Konstrukt für die Rechenanweisung lautet folgendermaßen:

baseBasisfd:Dateideskriptor

Um den Wert stattdessen aus einer Datei auszulesen, verwenden Sie die folgende Anweisung:

baseBasisfile:Dateiname

Beim Einsatz in einem Skript maskieren Sie Variablen durch doppelte Anführungszeichen, wenn Sie diese an den entsprechenden Stellen des Konstrukts verwenden.

Arbeiten mit Variablen

Listing 1 zeigt, wie Sie Variablen in eine Spigot-Anweisung einbinden. Beim Testen kommen auch negative Zahlen zum Einsatz. Die einzelnen Optionen runden (--rn), kappen bei 50 Nachkommastellen (-d50) und formatieren die Ausgabe (--printf, 8 Stellen, 2 Nachkommastellen, Fließkommazahl).

Listing 1

#! /bin/bash
echo "Rechnen mit Spigot und Variablen"
read -p " Erste Zahl: " a
read -p "Zweite Zahl: " b
echo "Ergebnisse ohne Formatierung"
echo "----------------------------"
spigot --rn -d50 \("$a"*"$b"\)
spigot --rn -d50 \("$a"/"$b"\)
echo "Ergebnisse mit Formatierung"
echo "----------------------------"
spigot --rn -d50 \("$a"*"$b"\) --printf %8.2f
spigot --rn -d50 \("$a"/"$b"\) --printf %8.2f

Abbildung 3 zeigt den Ablauf. Sie müssen dazu das Skript entweder in der Form bash Skript aufrufen oder mit entsprechenden Rechten zum Ausführen versehen.

Abbildung 3: Ein kleines Shell-Skript demonstriert einige Funktionen von Spigot, unter anderem den Einsatz von Shell-Variablen als Teil der Anweisung.

Abbildung 3: Ein kleines Shell-Skript demonstriert einige Funktionen von Spigot, unter anderem den Einsatz von Shell-Variablen als Teil der Anweisung.

Konvertieren

Das Umrechnen zwischen Zahlensystemen erledigen Sie mit dem Tool über verschiedene Formen der Syntax. Die hier gezeigte funktioniert in jedem Fall:

echo Wert | spigot -bBasis Ausgabe 'baseBasis Eingabefd:0'

In Abbildung 4 finden Sie Beispiele für die gängigen Praxisfälle.

Abbildung 4: Das Umrechnen von Zahlen hin zu einem anderen Basiswert gelingt mit Spigot auf verschiedenen Wegen.

Abbildung 4: Das Umrechnen von Zahlen hin zu einem anderen Basiswert gelingt mit Spigot auf verschiedenen Wegen.

Frequenz berechnen

Das Exempel aus Listing 2 zeigt, wie Sie mit Variablen als Hochzahlen umgehen. Hier sehen Sie, dass die Variablen mittels Anführungszeichen isoliert sind, das e-12 beschreibt den Rest der Hochzahl. Mit dem Skript berechnen Sie die Frequenz eines Schwingkreises anhand der Spule (Induktivität, µH) und des Kondensators (Kapazität, pF). Abbildung 5 zeigt den Ablauf.

Listing 2

#! /bin/bash
#qrgrech.sh
echo "Schwingkreisberechnung, Ergebnis in MHz"
read -p "Induktivität in µH: " L
read -p "Kondensator in  pF: " C
echo "Induktivität: $L µH, Kondensator $C pF"
# Im Vorspann stellenrichtige Umrechnung für ISO-Einheiten auf H und F
echo "------------------------------"
qrg=$(spigot --rn -d50 "$L"e-6*"$C"e-12 | spigot --rn -d50 '(1/(2pi*sqrt(base10fd:0))/1000000)' --printf %10.3f)
echo "Frequenz $qrg MHz"

Abbildung 5: Spigot hilft beim Berechnen der Frequenz eines Schwingkreises.

Abbildung 5: Spigot hilft beim Berechnen der Frequenz eines Schwingkreises.

Rechenanweisung in Variablen

Sie können Anweisungen für eine Rechenoperation auch in einer Variablen unterbringen. Da die Möglichkeit besteht, dass ein Anwender mit negativen Zahlen rechnet, müssen Sie Variablen, die Zahlen führen, mit entwerteten Klammern umgeben (Listing 3). Abbildung 6 zeigt die Ausgabe mit zwei Kommastellen.

Listing 3

#! /bin/bash
#rechner.sh
read -p "     Erste Zahl: " a
read -p "Rechenanweisung: " op
read -p "    Zweite Zahl: " b
echo -n "$a $op $b ergibt "; spigot --rn -d50 \($a$op$b\) --printf %10.2f

Abbildung 6: Bei Bedarf speichern Sie eine Rechenanweisung in einer Variable.

Abbildung 6: Bei Bedarf speichern Sie eine Rechenanweisung in einer Variable.

Ergebnisse plotten

Wenn Sie das Berechnen des Schwingkreises etwas ergänzen, liefert das Skript sogar die nötigen Daten für ein Schaubild. Auf diese Weise ließen sich etwa abstimmbare Schwingkreise berechnen (Frequenzvariation durch Drehkondensator). Im Beispiel aus Listing 4 kommen außerdem die Kreiszahl (pi) und die Wurzelfunktion sqrt zum Einsatz.

Listing 4

#! /bin/bash
#vfo.sh
# Löschen evtl. vorhandener Ergebnistabelle
rm ergtab.txt
clear
echo "Berechnung Abstimmbereich LC-Schwingkreis"
echo "--------------------------------------------------"
read -p "              Spule: Induktivität in µH: " L
read -p "   Drehkondensator: höchster Wert in pF: " Cmax
read -p "Drehkondensator: niedrigster Wert in pF: " Cmin
# Cmin um 1 vermindern für for-Schleife
Cmin=$(echo $Cmin | spigot 'base10fd:0-1')
for (( C =Cmax; C > Cmin; C--)); do
  qrg=$(spigot --rn -d50 "$L"e-6*"$C"e-12 | spigot --rn -d50 '(1/(2pi*sqrt(base10fd:0))/1000000)' --printf %10.3f)
  echo "$C $qrg" >> ergtab.txt
done
gnuplot ergtab.plt
evince ausgabe.eps

Die For-Schleife gibt je Durchgang den um 1 verminderten maximalen Wert für die Kapazität (Cmax) des Drehkondensators an, bis der Minimalwert (Cmin) erreicht ist. Die Ergebnisse (Werte für Kapazität und Frequenz) landen in einer Tabelle. Mittels Gnuplot [4] erstellen Sie das Diagramm als EPS-Datei, die Sie dann mit dem Programm Evince anzeigen. Abbildung 7 zeigt den Ablauf mit dem Ergebnis.

Abbildung 7: Mit Spigot berechnen Sie nicht nur Daten, sondern geben diese bei Bedarf auch als Plot wieder aus.

Abbildung 7: Mit Spigot berechnen Sie nicht nur Daten, sondern geben diese bei Bedarf auch als Plot wieder aus.

Um die Grafik etwas ansprechender zu gestalten, schreiben Sie die passenden Anweisungen in eine Datei mit der Endung .plt (Listing 5). Dorthin kommen Angaben zu den Achsen, zum Raster und zur Beschriftung sowie das Format für die Ausgabe (hier: eps).

Listing 5

set term eps
set grid xtics mxtics ytics mytics linestyle 5
set sample 100000
set xtics 0,5
set mxtics 2
set ytics 0,1
set mytics 2
set xlabel "Kondensator (pF)"
set ylabel "Frequenz (MHz)"
set output "ausgabe.eps"
plot "ergtab.txt" with lines title "Frequenz (MHz)"

Fazit

Bei Spigot handelt es sich um ein mächtiges Werkzeug zum Rechnen, obwohl manches am Bedienkonzept zunächst umständlich anmutet. Wenn Sie sich jedoch erst einmal mit den Eigenheiten vertraut gemacht haben, erledigen Sie selbst komplexe Rechenaufgaben im Handumdrehen per Skript. 

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 04/2017 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben