Arithmetik

Home Nach oben Bedeutung Arithmetik Postfix-Notation Wahrheitswerte Texte Bedingte Ausdrücke Indizierte Berechnung Stichworte


Stichworte ]

Darstellung und Bedeutung arithmetischer Ausdrücke


Wir haben bereits arithmetische Ausdrücke kennen gelernt. In der Mathematik bedeutet der Ausdruck:

(Kosten + Preis) · Steuer

dass die Summe der Werte von Kosten und Preis mit dem Wert von Steuer zu multiplizieren ist. In der Informatik soll darunter exakt das gleiche verstanden werden, wobei natürlich für die Objekte Kosten, Preis und Steuer jeweils numerische Ausprägungen existieren müssen. Die Klammerung „(“ und „)“ hat also keine eigentliche Bedeutung, sondern gibt nur an, in welcher Reihenfolge die Ergebnisse zu berechnen sind. Dabei müssen immer erst die Werte innerhalb der Klammern ausgerechnet werden, und dann das Klammerpaar „(<wert>)“ durch den „<wert>“ ersetzt werden.

Dies ist eine gewohnte Interpretation eines solchen Ausdrucks und sollte daher auch nicht neu definiert werden. Werden jedoch mehrere Operatoren ohne Klammerung geschrieben, so muss bereits festgelegt werden, in welcher Reihenfolge die jeweiligen Operationen auszuführen sind. Beispielsweise bedeutet:

Kosten + Preis · Steuer

in der Mathematik, dass zunächst die Multiplikation ausgeführt und dazu dann Kosten addiert wird. Auch in der Informatik wäre es unsinnig, diese Interpretation zu ändern. Bedauerlicherweise gibt es jedoch einige Programmiersprachen, wie APL oder Smalltalk, bei denen nicht auf den Vorrang (precedence) einzelner Operatoren geachtet wird. Sollte ein Programm in einer solchen Sprache zu schreiben sein, so stimmen Syntax und gewohnte Semantik nicht überein, was häufiger Anlass von Fehlern ist.

In der Mathematik werden die Vorrangregeln meistens nur für die arithmetischen Operatoren festgelegt. Man sagt, dass ein Operator stärker bindet als ein anderer, falls der erste Operator vor dem zweiten auszuführen ist. Die Regel: „Punkt-Rechnung vor Strich-Rechnung“ kann also formuliert werden als: „*“ und „/“ binden stärker als „+“ und „–“. In der Informatik sind diese Regeln etwas zu verfeinern. So sind in der Mathematik die Ausdrücke

(Mehl + Wasser) + Salz

und

Mehl + (Wasser + Salz)

identisch, d.h. sie liefern exakt den gleichen Wert, so dass man auch zweifelsfrei schreiben kann:

Mehl + Wasser + Salz.

Man nennt diese Eigenschaft in der Mathematik die Assoziativitätsregel. In einem Programm können jedoch aufgrund von Rundungsfehlern die beiden Ergebnisse durchaus verschieden sein, so dass der Wert des letzten Ausdrucks eindeutig definiert werden muss. Bedeutet:

Mehl + Wasser + Salz

das gleiche wie

(Mehl + Wasser) + Salz

so nennt man den Operator „+“ linksassoziativ, da der linke Operator vor dem rechten auszuführen ist. In den meisten Programmiersprachen sind „+“ und „*“ als linksassoziativ definiert. Entsprechend gibt es natürlich auch eine rechtsassoziative  Addition und Multiplikation, die jedoch ungebräuchlich sind. Ebenso sind Subtraktion und Division linksassoziativ, d.h. es gilt:

Mehl – Wasser – Salz  =  (Mehl – Wasser) – Salz

Frage
Würde der letzte Ausdruck ein anderes Ergebnis liefern, wenn die Subtraktion rechtsassoziativ wäre? Gilt dies auch für die Division?

In der Mathematik werden weitere Standardoperatoren definiert, wie die Exponentiation oder das Wurzelziehen. Außerdem werden dort häufig komplexere Operationen verwendet, wie trigonometrische Funktionen oder das Logarithmieren. Auch diese sollten in der üblichen mathematischen Notation geschrieben werden können, z.B.

sin Winkel ^ 2 + cos Winkel ^ 2

Hier steht sin Winkel^2 für (sin Winkel)2 d.h. wir nehmen an, daß sin stärker bindet als „^“. Möchte man den Sinus des Quadrats des Winkels berechnen, so muss man durch Klammerung den Vorrang ändern:

sin (Winkel ^ 2) + cos (Winkel ^ 2)

Da „^“ stärker bindet als die elementaren arithmetischen Operatoren, gilt beispielsweise:

SeiteA ^ 2 + SeiteB ^ 2 ist gleichbedeutend mit (SeiteA ^ 2) + (SeiteB ^ 2)

Meistens wird - wie in der Mathematik 999=9(99)- die Exponentiation als rechtsassoziativ festgelegt, so dass wir erhalten:

9 ^ 8 ^ 7  =  9 ^ (8 ^ 7)

Die genaue Definition ist natürlich der jeweiligen Beschreibung der Programmiersprache zu entnehmen. Um Missverständnissen vorzubeugen ist es ein guter Programmierstiel, Ausdrücke in Zweifelsfällen stets zu klammern, so dass die eindeutige Berechnungsreihenfolge aus dem Formelbild entnommen werden kann.

Ein weiteres Problem stellt die implizite Klammerung durch Bruchstriche dar. In der Mathematik bedeutet

während der Ausdruck:

bedeutet. Die übliche mathematische Notation ist hier nicht immer eindeutig, so dass das Formelbild vom Leser u.U. anders interpretiert wird. Auch hier kann man durch eigentlich redundante Klammern Missverständnissen vorbeugen:

Man erkennt allerdings hieran auch, dass die mathematische Notation mit Bruchstrich etwas übersichtlicher ist als die informatische, die für die Division lediglich das Symbol „/“ verwendet. Gerade in numerischen Programmen ist daher auf eine möglichst übersichtliche Darstellung von arithmetischen Ausdrücken zu achten, um dem Leser des Programms die Möglichkeit zu geben, den Ausdruck zweifelsfrei zu verstehen. Da die meisten Programmiersprachen den Zeilenumbruch auch in Ausdrücken zulassen, sollte dieser gegebenenfalls geschickt eingesetzt werden. So wird z.B. aus

      

der informatische Ausdruck

   ((sin Wi1 + cos Wi2)*(Anf*Ende + Wert/2 - Chi^2*Delta))
/ ---------------------------------------------------------
                   
(Phi – Sigma*(1–Omega^2))

Hier wurde vorausgesetzt, dass ein Kommentar (also Text, der vom Programm ignoriert wird) durch ein „--“ eingeleitet wird und bis zum Zeilenende geht. Somit hat der lange waagerechte Strich keine Bedeutung für das Programm. Er hilft aber, den Ausdruck zu verstehen.

Zurück zum Anfang


Bei Fragen und Unklarheiten wenden Sie sich bitte an: kowalk@informatik.uni-oldenburg.de
Stand:17. November 2001