Die Computerarithmetik und der Fehler in numerischen Berechnungen

In diesem Unterpunkt werden wir zwei Klassen von Fehlerquellen in numerischen Berechnungen besprechen, den sogenannten Rundungsfehler der aufgrund der Computerarithmetik entsteht und der sogenannte Approximierungsfehler (Abschneidefehler bzw.'Truncation error'), der immer dann auftritt, wenn der Programmierer eine exakte mathematische Gleichung mittels approximativer Ausdrücke annähert.

Die Computerarithmetik und der Rundungsfehler

In der Mathematik werden Zahlen mit einer unendlichen Anzahl von Nachkommastellen zugelassen und die definierte Arithmetik auf diesem Zahlenraum ℝ ist exakt (siehe Unterpunkt Datentypen und Variablen). Der Zahlenraum in dem der Computer rechnet (ℝ$_C$), benutzt jedoch Zahlen, die nur eine endliche Anzahl von Nachkommastellen haben und es wird hierbei nur eine relativ kleine Teilmenge der reellen Zahlen benutzt. Diese Teilmenge ℝ$_C$ umfasst nur rationale Zahlen und speichert den gebrochenen Teil, der mit Mantisse bezeichnet wird, zusammen mit dem exponentiellen Teil, welchen man Charakteristik nennt. Hierbei speichert der Computer die Zahl als eine binäre Liste von Nullen und Einsen. Im Folgenden wird das Beispiel der Speicherung einer Gleitkommazahl einfacher Genauigkeit besprochen, wie sie in IBM-Großrechnern der 3000er Serie benutzt wurde (Details findet man in R.L. Burden und J.D. Faires 2000: Numerische Methoden, Kapitel 1.3 ). In diesen Rechnern besteht eine Zahl mit einfacher Genauigkeit aus einem Vorzeichen-bit, einem 7-bit Exponenten der Basis 16 und einer 24-bit-Mantisse. Wir betrachten z.B. die binäre Computerzahl \[ \begin{equation} \underbrace{0}_{\hbox{Vorzeichen}} \, \underbrace{1000010}_{\hbox{Charakteristik}} \, \underbrace{101100110000010000000000}_{\hbox{Mantisse}} \quad. \end{equation} \] Das Vorzeichen-bit ist 0, was bedeutet, dass die Zahl positiv ist. Die darauf folgenden 7-bit Zahlen beschreiben die Charakteristik, und diese berechnet sich wie folgt: \[ \begin{equation} 1 \cdot 2^6 + 0 \cdot 2^5 + 0 \cdot 2^4 + 0 \cdot 2^3 + 0 \cdot 2^2 + 1 \cdot 2^1 + 0 \cdot 2^0 = 66 \end{equation} \] Um auch kleine Zahlenwerte abbilden zu können, wird von diesem Wert 64 abgezogen, sodass man als Exponenten der Zahl $16^{66-64}=16^{2}$ erhält. Der Zahlenwert der Mantisse ergibt sich wie folgt aus der am Ende stehenden 24-bit Zahlenfolge (die Null-Einträge sind hierbei nicht aufgelistet): \[ \begin{equation} 1 \cdot \left( \frac{1}{2} \right)^1 + 1 \cdot \left( \frac{1}{2} \right)^3 + 1 \cdot \left( \frac{1}{2} \right)^4 + 1 \cdot \left( \frac{1}{2} \right)^7 + 1 \cdot \left( \frac{1}{2} \right)^8 + 1 \cdot \left( \frac{1}{2} \right)^{14} = 0.69927978515625 \end{equation} \] Die eigentliche Gleitkommazahl ergibt sich nun mittels der folgenden Formel Zahl:=$\, M \cdot 16^{\,C - 64}$, wobei $M$ den Zahlenwert der Mantisse und $C$ den Wert der Charakteristik bezeichnet. Die entsprechende Gleitkommazahl unserer gesamten binären Zahlenliste $01000010101100110000010000000000$ berechnet sich somit schließlich zu folgendem Zahlenwert: \[ \begin{equation} 01000010101100110000010000000000 \quad \Longleftrightarrow \quad 0.69927978515625 \cdot 16^{2} = 179.015625 \end{equation} \] Die nächst größere, mit dem Computer abbildbare Zahl hat den folgenden Wert \[ \begin{equation} 01000010101100110000010000000001 \quad \Longleftrightarrow \quad 0.6992798447608948 \cdot 16^{2} = 179.0156402587890625 \quad , \end{equation} \] und die nächst kleinere Zahl wäre \[ \begin{equation} 01000010101100110000001111111111 \quad \Longleftrightarrow \quad 0.6992797255516052 \cdot 16^{2} = 179.01560974121094 \quad . \end{equation} \] Dies bedeutet, dass die ursprüngliche Maschinenzahl nicht nur die Zahl $179.015625$ abbildet, sondern dass alle Zahlen, die im Programm einen Wert im Bereich $[179.01561737060546875 , 179.01563262939453125]$ annehmen, mit dieser Zahl dargestellt werden. Immer, wenn man z.B. die Variable einer Gleitkommazahl initialisiert, speichert der Computer den Zahlenwert nicht auf unendliche Genauigkeit ab, sondern nimmt die nächstmögliche Zahl, die ihm in seiner diskreten Zahlenmenge zu Verfügung steht.

Als Rundungsfehler bezeichnet man nun den Fehler, der aufgrund dieser Computerarithmetik entsteht und er tritt im Prinzip bei jeder Computerberechnung mit reellen Zahlen auf.

Der Approximierungsfehler 'Truncation error'

Der 'Truncation error' (Abschneidefehler bzw. Approximierungsfehler) ist ein Fehler, dessen Größe der Programmierer, zumindest in einem gewissen Bereich, unter seiner eigenen Kontrolle hat. Er tritt immer dann auf, wenn exakte mathematische Gleichungen mittels approximativer Ausdrücke annähert.
Betrachten wir z.B. die im Unterpunkt Anwendungsbeispiel: Folgen und Reihen besprochene approximative Annäherung an die Kreiszahl $\pi = 3.141592653589793...$ mittels der alternierenden Leibniz-Reihe und nehmen an, dass wir dabei lediglich $N=10$ Folgenglieder der Partialsumme bei der Approximation berücksichtigen: \[ \begin{equation} \pi_{approx} = 4 \cdot \sum_{k=0}^{10} \frac{(-1)^k}{2 k +1} ,\quad \hbox{dann gilt:} \quad \pi = 4 \cdot \sum_{k=0}^\infty \frac{(-1)^k}{2 k +1} = \pi_{approx} + \underbrace{4 \cdot \sum_{k=11}^\infty \frac{(-1)^k}{2 k +1} }_{\hbox{Truncation error}} \end{equation} \] Der Programmierer hat es dabei selbst in der Hand, wie viele Folgenglieder der Partialsumme er mitnimmt und somit wie groß der Abschneidefehler seiner Approximation ist. Im Laufe der Vorlesung werden wir in vielen Anwendungen Approximierungen von exakten mathematische Ausdrücken machen und der dabei entstehende Truncation error ist hierbei oft die größte Fehlerquelle.