Rundungsfehler und Gleitkommaarithmetik

2.2. Rundungsfehler und Gleitkommaarithmetik#

Wie wir schon im vorigen Abschnitt gesehen haben ist die Menge aller Maschinenzahlen \(A \subset \mathbb{Q}\) endlich. Im Folgenden wollen wir uns also mit der Frage beschäftigen, wie sich eine nicht exakt darstellbare Zahl \(x \not\in A\) durch eine Maschinenzahl \(\tilde{x} \in A\) approximieren lässt. Wie wir sehen werden taucht dieses Problem nicht nur bei der Speicherung der Zahl \(x\) auf, sondern bei allen mathematischen Berechnungen im Digitalrechner. Eine vernünftige Bedingung an eine Approximation der Zahl \(x\) durch eine Maschinenzahl \(\tilde{x} = \operatorname{rd}(x) \in A\) ist gegeben durch:

(2.1)#\[|x - \tilde{x}| \ = \ |x - \operatorname{rd}(x)| \ \leq \ |x - y|, \quad \forall y \in A.\]

Man erhält solch eine Approximation \(\operatorname{rd}(x)\) im Digitalrechner durch Rundung.

Beispiel 2.4 (Rundung für Basis b=10)

Für die Basis \(b=10\) und eine Mantissenlänge von \(p=4\) erhalten wir folgenden Approximationen:

  1. \(x = 1.97689743 \quad \Rightarrow \quad \operatorname{rd}(x) = 1.9769\)

  2. \(x = 1.374651 \quad \Rightarrow \quad \operatorname{rd}(x) = 1.3747\)

  3. \(x = 1.07743846282 \quad \Rightarrow \quad \operatorname{rd}(x) = 1.0774\)

Falls \(\operatorname{rd}(x) \in A\) eine Maschinenzahl ist, so erfüllt diese Approximation die gewünschte Eigenschaft (2.1) für alle \(y \in A\). Jedoch gibt es auch Fälle in denen die für uns intuitiv gewählte Rundungsoperation nicht zwangsläufig eine Maschinenzahl liefert, wie wir im folgenden Beispiel sehen können.

Beispiel 2.5 (Probleme bei der Rundungsoperation)

Wir betrachten folgende Beispiele für den Fall der Basis \(b=10\) mit einer Mantissenlänge von \(p=4\) und einer Exponentenlänge von \(r=2\):

  1. \(\operatorname{rd}(1.31794\cdot10^{145}) \ = \ 1.3179 \cdot 10^{145} \not\in A\)

  2. \(\operatorname{rd}(1.368589\cdot10^{99}) \ = \ 0.13686 \cdot 10^{100} \not\in A\)

Im ersten Fall handelt es sich um keine Maschinenzahl da der Exponent \(145\) die Länge \(3\) hat und nur eine Exponentenlänge von \(r=2\) vorliegt. Im zweiten Fall kommt es zu einem Exponentenüberlauf durch die in diesem Beispiel gewählte Normalisierung der Gleitkommazahl durch \(1/10 \leq m < 1\).

Um den Fehler einer numerischen Operation anzugeben gibt es zwei gängige Fehlermaße, die in folgender Definition erklärt werden.

Definition 2.4 (Absoluter und relativer Fehler)

Sei \(x\) ein exakter Wert und \(\tilde{x}\) eine Approximation des exakten Wertes \(x\), d.h. es gilt \(\tilde{x} \approx x\). Dann definieren wir die folgenden Fehlergrößen:

  1. \(\Delta_x \coloneqq |\tilde{x} - x|\) bezeichnet den absoluten Fehler.

  2. \(\delta_x \coloneqq \frac{\Delta_x}{|x|} = \frac{|\tilde{x} - x|}{|x|}\) bezeichnet für \(x \neq 0\) den relativen Fehler.

Für den Fall, dass für eine Zahl \(x\in \mathbb{R}\) die Rundungsoperation eine Maschinenzahl \(\operatorname{rd}(x) \in A\) liefert, wollen wir den relativen Fehler dieser Approximation für die Basis \(b=10\) betrachten. Wir setzen also

(2.2)#\[\frac{| x - \operatorname{rd}(x)|}{|x|} \ = \ \frac{|m - \tilde{m}| \cdot 10^e}{|m| \cdot 10^e} \ \leq \ \frac{5\cdot 10^{-(p+1)}}{|m|} \ = \ \frac{5\cdot 10^{-p}}{|m|\cdot 10^1} \ \leq \ 5\cdot 10^{-p}\]

Wir haben hierbei ausgenutzt, dass sich die Zahl \(x\) als normalisierte Gleitkommazahl darstellen lässt, bei der gilt, dass \(1/10 \leq m < 1\) gilt. Der relative Fehler durch die Rundung wird also (wie zu erwarten) maßgeblich durch die Mantissenlänge \(p\) bestimmt. Basierend auf dieser Abschätzung können wir eine Kennzahl für die Genauigkeit eines Digitalrechners einführen.

Definition 2.5 (Maschinengenauigkeit)

Wir definieren die Maschinengenauigkeit eines Digitalrechners mit Mantissenlänge \(p \in \mathbb{N}\) als

\[\operatorname{eps}_{10} \coloneqq 5\cdot 10^{-p}\]

bezüglich der Basis \(b=10\). Analog lässt sich die Maschinengenauigkeit bezüglich der Basis \(b=2\) definieren als

\[\operatorname{eps}_2 \coloneqq 2^{-p}.\]

Kontextabhängig verwenden wir auch die einfach die Bezeichnung \(\operatorname{eps}\) für die Maschinengenauigkeit wenn die Wahl der Basis klar ist.

Lassen wir einmal die Probleme mit einem Exponentenüber- bzw. Exponentenunterlauf außer Acht, so lässt sich mit Hilfe der Maschinengenauigkeit aus dem relativen Fehler durch die Rundungsoperation in (2.2) folgendes ableiten:

(2.3)#\[\operatorname{rd}(x) \ = \ x\cdot(1+\epsilon) \quad \text{ mit } \quad |\epsilon| \leq \operatorname{eps}.\]

Da das Resultat arithmetischer Operationen auf Maschinenzahlen \(x,y \in A\) wie \(x+y, x-y, x\cdot y\), und \(x / y\) keine Maschinenzahl sein muss, so kann man erwarten, dass diese Operationen nicht exakt im Digitalrechner realisiert werden. Stattdessen werden Ersatzoperationen \(+^*,-^*,\cdot^*,/^* \colon A \times A \rightarrow A\) implementiert, die eine vernünftige Gleitpunktarithmetik realisieren. Diese arithmetischen Gleitpunktoperationen lassen sich mit Hilfe der Rundungsoperation in (2.3) wie folgt angeben:

\[\begin{aligned} (x +^* y) \ &\coloneqq \ \operatorname{rd}(x+y) \ = \ (x+y)\cdot(1+\eps_1) \\ (x -^* y) \ &\coloneqq \ \operatorname{rd}(x-y) \ = \ (x-y)\cdot(1+\eps_2)\\ (x \cdot^* y) \ &\coloneqq \ \operatorname{rd}(x\cdot y) \ = \ (x\cdot y)\cdot(1+\eps_3)\\ (x /^* y) \ &\coloneqq \ \operatorname{rd}(x/y) \ = \ (x/y)\cdot(1+\eps_4) \end{aligned}\]

für \(x,y \in A\) und \(|\eps_i| \leq \operatorname{eps}\) für \(i=1,\ldots,4\).

Bemerkung 2.2

Die üblichen Gesetzmäßigkeiten der arithmetischen Operationen in \(\mathbb{R}\) gelten im Allgemeinen nicht für die arithmetischen Gleitpunktoperationen. So ist zum Beispiel

\[x +^* y \ = \ x \quad \text{ falls } |y| < \frac{\operatorname{eps}}{b}|x|.\]

Der Grund ist, dass bei einer Angleichung des Exponenten von der Gleitkommarepräsentation von \(y\) an den Exponenten von \(x\) die gesamte Mantisse von \(y\) ausgelöscht wird, da für die Basis \(b=2\) beispielsweise gilt:

\[|y| < \frac{\operatorname{eps}}{b}|x| \quad \Rightarrow \quad |y| \cdot 2^{p+1} < |x|.\]

Aus dieser Beobachtung lässt sich die Maschinengenauigkeit auch als die kleinste positive Maschinenzahl \(\operatorname{eps} \in A\) definieren, für die gilt:

\[\operatorname{eps} \ \coloneqq \ \min\lbrace y \in A \, | \, 1 +^* y > 1\rbrace .\]

Folgendes Beispiel zeigt, dass bekannte algebraische Gesetzmäßigkeiten des Körpers der reellen Zahlen für die Menge der Maschinenzahlen \(A \subset \mathbb{Q}\) bezüglich der arithmetischen Gleitpunktoperationen im Allgemeinen nicht gelten, wie z.B. das Assoziativgesetz. Hier tritt insbesondere ein als Auslöschung bekanntes Phänomen auf, welches zu gravierenden numerischen Fehlern führen kann.

Beispiel 2.6 (Auslöschung)

Wir betrachten drei Maschinenzahlen \(a,b,c \in A\) in der normalisierten Gleitpunktdarstellung bezüglich der Basis \(b=10\) mit einer Mantissenlänge von \(p=8\) und einer Exponentenlänge von \(r=2\). Dann gilt für

\[\begin{aligned} a & \coloneqq 0.23371258 \cdot 10^{-4},\\ b & \coloneqq 0.33678429 \cdot 10^{2},\\ c & \coloneqq -0.33677811 \cdot 10^{2} \end{aligned}\]

bei unterschiedlicher Reihenfolge der Additionsoperation \(+^* \colon A \times A \rightarrow A\) folgendes:

\[\begin{aligned} a +^* (b +^* c) \ &= \ 0.23371258\cdot 10^{-4} +^* 0.61800000 \cdot 10^{-3}\\ &= \ 0.64137126 \cdot 10^{-3}\\ (a +^* b) +^* c \ &= \ 0.33678452\cdot 10^{2} -^* 0.33677811 \cdot 10^{2}\\ &= \ 0.64100000 \cdot 10^{-3} \end{aligned}\]

Bei der ersten Berechnung traten glücklicherweise keine Rundungsfehler bei der Operation \((b +^* c)\) auf. Bei der zweiten Berechnung entstehen bei der Operation \((a +^* b)\) jedoch wegen der beschränkten Mantissenlänge signifikante Rundungsfehler, die dann durch die anschließende Auslöschungsoperation zu einem stark veränderten Ergebnis führt. Das exakte Ergebnis in \(\mathbb{R}\) ist gegeben durch

\[a + b + c \ = \ 0.641371258 \cdot 10^{-3}.\]

Auslöschung tritt immer dann auf, wenn Maschinenzahlen mit dem gleichen Vorzeichen voneinander subtrahiert werden, die den gleichen Exponenten aufweisen und in den ersten Stellen der Mantisse übereinstimmen.