(Physical Expression Calculator)
Freeware, Copyright Christian Schirm
Email: christian.schirm (ät) gmail.com
6. Zahlenformate und Zahlensysteme
9. Schnellschreibweise und Mehrdeutigkeiten
Das Programm PhyxCalc berechnet mathematische Ausdrücke samt physikalischen Einheiten in einer flexiblen Texteditor-Umgebung. Über die Zwischenablage ist auch die Interaktion mit anderen Programmen möglich. Die Schreibweise ist fast so einfach wie auf Papier. So kann z.B. anstelle von 2*ln(2)
auch 2ln2
geschrieben werden. Oder frei definierbare Variablen und Einheiten können im Ausdruck verwendet werden (z.B. Dichte=1kg/l; Masse=Dichte*140cm*20m²
).
Trotz der intuitiven und einfachen Schreibweise müssen folgende Regeln beachtet werden:
Im Editorfenster des Programms können Ausdrücke eingegeben und ausgewertet werden. Durch betätigen der Eingabetaste wird der Ausdruck in der aktuellen Zeile berechnet und das Ergebnis in der darauf folgenden angezeigt. Diese wird automatisch ersetzt, wenn sie mit einem Gleichheitszeichen beginnt, also ein früheres Ergebnis enthält. In der Statusleiste werden solche Ergebnisse angezeigt, die nicht ausgegeben werden, wie z.B. bei einer Variablenzuweisung. Im Kontextmenü kann ein Tastenfeld geöffnet werden mit den wichtigsten Funktionen. Das Tastenfeld kann in der Datei phyxcalc_pad.txt selbsterklärend angepasst werden.
Beispiel (Nährungsformel für Pi):
3*ln(640320)/sqrt(163) <Enter>
=3.141592653589793
<Enter>: Ausdruck der aktuellen Zeile auswerten
< Umschaltetaste + Enter>: Zeilenumbruch einfügen
< Strg + Enter>: Ausdruck auswerten, Cursor behält die Position
<Strg + x>: markierten Text ausschneiden
<Strg + c>: markierten Text kopieren
<Strg + v>: Zwischenablage am Cursor einfügen
<Strg + a>: alles markieren
<Strg + Mausrad>: temporäres Vergrößern der Schrift
help
zeigt diese Hilfe an (auch über das Kontextmenü zugänglich)
list
listet alle während der Sitzung definierten Variablen und Einheiten auf
listdef
listet alle in der Datei phyxcalc_def.txt definierten Variablen und Einheiten auf
listini
listet alle in Einstellungsvariablen auf, die in der Datei phyxcalc.ini gespeichert werden.
clear
löscht den Inhalt des Editors
exit
beendet das Programm
ini.left, ini.top, ini.width, ini.heigth
: speichert die Fensterkoordinaten bei jedem Beenden des Programms
ini.stayontop
: Option um das Fenster im Vordergrund zu halten.
ini.fontsize
: Schriftgröße
ini.transparency=20
Transparenz des Fensters (Werte zwischen 0 und 255, ab Windows XP)
ini.savesession=1
Option um den Editorinhalt beim Beenden zu speichern
ini.keypad=1
Option um das Tastenfeld einzublenden
ini.digits=15
Angezeigte Dezimalstellen (intern wird immer mit 19 bis 20 Dezimalstellen gerechnet)
Alle mathematischen Funktionen können klein, groß oder nur mit Großbuchstaben geschrieben werden. Die Trigonometrischen Funktionen beziehen sich auf das Bogenmaß (rad). Mit der Einheit ° (s. unten) kann eine Konvertierung von und nach Grad erfolgen.
+ - * / ^ ² ³ ! ( ) | | { }
(Addition, Subtraktion, Multiplikation, Division, Exponent, hoch 2, hoch 3, Fakultät, Klammern, Betragsklammern, Zahlenwertklammern (entfernt Einheiten, bezogen auf die Grundeinheiten))
sin, cos, tan, arcsin, arccos, arctan
sinh, cosh, tanh, arcsinh, arccosh, arctanh
log2, ln, log10, logn(n,x), exp, sqrt = sqr
min(a,b), max(a,b)
abs(x) (Betrag, identisch zur Schreibweise |x|)
sign(x) = -1, 0, 1 entsprechend der Fälle x<0, x=0, x>0
heaviside(x) = 0, 1 entsprechend der Fälle x<0, x>=0
int = trunc, ceil, floor, round
(Abschneiden, auf-, abrunden, runden)
rnd
liefert Zufallszahl 0<=rnd<1)
rndi(i)
liefert ganzzahlige Zufallszahl 0<=rndi(i)<i
rndg(m, std)
liefert Gaußverteilte Zufallszahl mit Mittelwert m und Standardabweichung std
Um eine lange Liste von Zahlen oder Ausdrücken zu Addieren, kann am Ende der ersten Zeile ein Plus angehängt werden. Das Ergebnis dieser und der darauf folgenden Zeilen wird dann nicht ausgegeben, sondern aufsummiert und als Zwischensumme in der Statusleiste angezeigt. Erst eine leere Zeile führt zur Ausgabe der Summe.
Diese Funktion ist ebenfalls für die Subtraktion, Multiplikation und Division möglich. Sie kann auch dazu verwendet werden um sehr lange Ausdrücke in mehrere Zeilen aufzuteilen. Dabei ist jedoch zu beachten, dass jede angehängte Zeile als eigenständiger Term sofort ausgewertet und verrechnet wird, ohne eventuelle Punkt-vor-Strich-Regeln mit anderen Zeilen zu beachten.
Beispiel Addition
12+ <Enter>
4 <Enter>
3 <Enter>
5 <Enter>
<Enter>
=24
Beispiel Multiplikation
2* <Enter>
2+3 <Enter>
<Enter>
=10 //also 2*(2+3) und nicht etwa 2*2+3
Beliebige Variablen können als Zwischenspeicher oder als Parameter für bestimmte Ausdrücke verwendet werden. (Auch die Definition von Einheiten ist möglich, siehe unten.)
Definition mittels <Variable> = <Ausdruck>
In der Textdatei phyxcalc_def.txt können Einheiten und Variablen ergänzt werden, die automatisch beim Start des Programms geladen werden. Der Befehl list listet alle aktuell zugewiesenen Einheiten und Variablen auf. Variablen können wieder gelöscht werden indem sie mit einem leeren Ausdruck überschreiben werden. Mehrere Zuweisungen können durch Strichpunkte aneinandergereiht werden. Am Ende der Zeile können Bemerkungen mit zwei Schrägstrichen // angefügt werden. Aktuell definierte Variablen werden in der Statusleiste angezeigt.
Beispiel:
f=50; b=70; a=1/(1/f-1/b); a/10
=17.5
f= //löscht die Variable f
Eine Besonderheit gilt für die Variable #. Sie wird nach jeder Ausgabe eines Zahlenwertes automatisch mit diesem gefüllt. Ansonsten kann sie wie eine gewöhnliche Variable behandelt werden.
Beispiel:
5+4
=9
#+sqr(#) //# wirkt wie die "Ans"-Taste bei manchen Taschenrechnern
=12
Damit lässt sich auch eine einfache Nullstellensuche durchführen. Die Iteration x=x+eta*f(x) konvergiert nämlich bei geschickter Wahl eines Startwertes von x, einer Schrittweite eta und eines Vorzeichens von eta gegen einen stabilen Grenzwert x, der f(x)=0 erfüllt. Als Variable kann # verwendet werden, wie im folgenden Beispiel gezeigt wird.
Beispiel: Nullstellensuche der Funktion ln(x)+x-2
#=1 //startwert der Iteration setzen
#-0.5*(ln(#)+#-2) //hier mit <Strg + Enter> Berechnung mehrmals ausführen
=1.557145598997611 //stabiles Ergebnis nach 20 Iterationen
Als Dezimaltrennzeichen ist sowohl ein Punkt als auch ein Komma möglich. Die Ausgabe passt sich an das zuletzt eingegebene Dezimaltrennzeichen an und erfolgt automatisch entweder ganzzahlig, mit Nachkommastellen oder im wissenschaftlichen Format mit Exponent. Die Eingabe ist in jedem dieser Formate möglich. Die Ausgabe wird auf 16 signifikante Stellen gerundet. Intern wird mit etwa 19 bis 20 Stellen Genauigkeit gerechnet.
Beispiel:
(10 + 1.1 + 2,2) * 2.2E-10
=2.926E-9
Zahlendarstellung in nichtdezimaler Darstellung ist für Basiswerte von 2 bis 36 möglich. An die Zahl wird das Indexsymbol _ (Unterstrich) und die Basis als Zahl angehängt oder im Falle von binären, oktalen und hexadezimalen Zahlen kann auch _b, _o und _h verwendet werden. Als zusätliche Symbole dienen die Buchstaben des Alphabets. Zur Rückkonvertierung wird der Konvertierungsoperator -> verwendet. Nachkommastellen sind wie in der Dezimalschreibweise zu verwenden. Bei hohen Basiswerten treten allerdings starke Rundungsfehler auf.
Beispiele:
255 ->_h //Konvertierung ins Hexadezimalsystem
=FF_h
FF_h //Hexadezimalzahl, Rückkonvertierung ins Dezimalsystem
=255
12345->_b //Konvertierung ins Binärsystem
=11000000111001_b
hallowelt_36 //Zahl mit Basis 36, Rückkonvertierung
=48789534109169
Zahlen können mit Einheiten versehen werden. Zusammengesetzte Einheiten müssen mit dem Multiplikationszeichen * getrennt werden. Alle Einheiten rechts von einem Divisionszeichen / werden als Nenner betrachtet. Die Ausgabe des Rechenergebnisses erfolgt in Grundeinheiten oder mit maximal einer zusammengesetzten Einheit, falls dies die Zahl der dargestellten Einheiten reduziert. Einheiten können gelöscht werden, indem sie mit einem leeren Ausdruck überschrieben werden.
Verschiedene Arten von Einheiten können definiert werden:
a) Grundeinheit
mittels leeren eckigen Klammern
Beispiel:
m=[] //Grundeinheit Meter
b) Zusammengesetzte Einheit
In eckigen Klammern "nackte" Einheiten ohne Zahl, oder ein beliebiger Ausdruck in doppelten eckigen Klammern.
Beispiel:
J=[kg*m^2/s^3] //Zusammengesetzte Einheit Watt
c) Fremdeinheit
In eckigen Klammern beliebiger Ausdruck. Fremdeinheiten werden automatisch in Grundeinheiten oder in zusammengesetzte Einheiten konvertiert. Bei Einheiten mit Offset, wie z.B. °C (Grad Celsius), kann ein Einheitenloser Summand an die eckicke Klammen angehängt werden. Einheiten mit Offset dürfen nur mit einer einzigen vorkommenden Basiseinheit gebildet werden.
Beispiele:
in=[2.54cm] //Fremdeinheit Inch
$=[0.8€] //Fremdeinheit Dollar (bei der Grundeinheit Euro)
°F=[5/9*1K]+459.67*5/9 //Fremdeinheit mit Offset
°=[pi/180] //Fremdeinheit Grad (in einer einheitenlosen Grundeinheit bzw. in rad)
(sin45°)^2 //45° wird hier zu pi/2 konvertiert.
=0.5
d) SI-Einheiten
Außerdem können Einheiten mit SI-Vorsätzen definiert werden. Die Definition erfolgt mit an die Einheit angesetztem @si, oder anstelle von si einem festen SI-Vorsatz, der die Grundgröße definiert, wie z.B. bei kg (Kilogramm).
Beispiele:
m@si=[] //Grundeinheit Meter mit SI-Vorsätzen z.B. mm, cm, km usw.
g@k=[] //Grundeinheit Kilogramm kg (1g wird dann in 0.001kg konvertiert)
mögliche Vorsätze physikalischer SI-Einheiten
d = 1E-1 (Dezi) da = 1E1 (Deka)
c = 1E-2 (Zenti) h = 1E2 (Hekto)
m = 1E-3 (Milli) k = 1E3 (Kilo)
µ = 1E-6 (Mikro) M = 1E6 (Mega)
n = 1E-9 (Nano) G = 1E9 (Giga)
p = 1E-12 (Piko) T = 1E12 (Tera)
f = 1E-15 (Femto) P = 1E15 (Peta)
Die SI-Vorsätze sind immer auch ohne echte Einheit zugänglich mit einem gefolgten Punkt als Dummy-Einheit, z.B. ist 5k. identisch zu 5000.
Beispiel:
m@si=[] //Definition der SI-Grundeinheit Meter
4/3*pi*(15cm)^3
=0.01413716694115407m³
(Ergibt das Kugelvolumen einer Kugel mit Radius 15cm in den Grundeinheiten, hier Kubikmeter = m³)
Mit dem Operator -> können Ausdrücke in bestimmte Einheiten konvertiert oder in Grundeinheiten (mit -> []) dargestellt werden.
Beispiele:
20m/s -> km/h
=72km/h
20kOhm -> []
=20000kg*m²/s³*A²
Außerdem können Ausdrücke als Vielfache anderer Ausdrücke dargestellt werden.
Beispiele:
22 -> 4.4
=5*4.4
3*arcsin(0.5) -> pi/8
=4*pi/8
Allgemein ist sichergestellt, dass bei einer Konvertierung die Ausgabe zur Eingabe äquivalent bleibt. Der Konvertieroperator ändert also niemals den (physikalischen) Wert, sondern nur die Darstellung. Bei einer Konvertierung zu einer falschen Größe (z.B. 1cm -> km/h) wird ein passender Korrekturfaktor angehängt, um die Äquivalenz zu erhalten.
Sowohl das Multiplikationszeichen als auch Klammern nach Funktionen können weggelassen werden. Das kann unter Umständen zu Mehrdeutigkeiten führen, was mit einer Fehlermeldung quittiert wird. Multiplikationen ohne Multiplikationszeichen können allerdings stillschweigend ignoriert werden, wenn dadurch die Anzahl dieser Multiplikationen auf eindeutige Weise verringert werden kann. Solche Multiplikationen werden also überhaupt nur in Erwägung gezogen, wenn der Ausdruck sonst keinen Sinn ergibt. Eindeutigkeit kann meistens durch einfügen eines Lehrzeichens wieder hergestellt werden. Funktionen ohne Klammern wirken nur einen einzelnen Faktor nach rechts, und nicht auf den restlichen Term (wie man es von Differenzialoperatoren kennt).
Beispiele:
2ln2 //Kurzschreibweise für 2*ln(2)
=1.386294361119891
(1+2)(2+3) //Kurzschreibweise für (1+2)*(2+3)
=15
Beispiel zur Eindeutigkeit:
a=2; b=3; ab=20
ab //wird als Variable ab interpretiert, die Möglichkeit a*b wird stillschweigend ignoriert
=20
ba //ist eindeutig b*a
=6
Beispiel zur Mehrdeutigkeit:
a=2; b=3; c=4; ab=50; bc=70
abc //verbleibende Interpretationsmöglichkeiten: ab*c oder a*bc
=>Ausdruck ist mehrdeutig
Ein weiterer Fall von Mehrdeutigkeit tritt auf, wenn eine Einheit und eine Variable den gleichen Namen tragen. Dies kann zu Mehrdeutigkeiten bei Multiplikationen und Divisionen führen, die sich in seltenen Fällen leider auch mit zusätzlichen Lehrzeichen nicht auflösen lassen. Dann muss die Variable oder die Einheit umbenannt werden.
Beispiel zur Mehrdeutigkeit:
s=[]; m=[] //Einheiten Sekunde und Meter
m=5 //Variable m
3s*m // mehrdeutig: 3 Sekunden mal Variable m oder 3 Sekunden mal Meter
=>Ausdruck ist mehrdeutig
Beispiele zur Eindeutigkeit:
3s* m // eindeutig, durch das eingefügte Leerzeichen: 3 Sekunden mal Variable m
=15s
3m/s //3 eindeutig: Meter durch Sekunde
=3m/s