Gleitpunktdarstellung

Zahldarstellung: Eine \(p\)-stellige normalisierte Gleitpunktzahl \(x\) zur Basis \(\beta \) besteht aus einem Vorzeichen \(\sigma = \pm 1\), einer Mantisse \(m = m_1 \dotsc m_p\), wobei \(m_i \in \{0, \ldots , \beta - 1\}\), \(m_1 \not = 0\), sowie einem Exponenten \(n\) mit \(n_{min} \le n \le n_{max}\):

\begin{align*} x = \sigma \left (\sum _{i=1}^p m_i \beta ^{1-i}\right ) \beta ^n. \end{align*} Die kleinste bzw. größte positive Gleitpunktzahl ist \(x_{min} = \beta ^{n_{min}}\) (\(+1.000 \E n_{min}\)) bzw.
\(x_{max} = \beta ^{n_{max}+1} (1 - \beta ^{-p})\) (\(+n.nn \dotsc n \E n_{max}\), \(n = \beta - 1\)).

Man schreibt auch \(x = (\pm m_1 . m_2 m_3 \ldots m_p \E n)_\beta \), also z. B. \((+3.042 \E 2)_{10}\) oder \((-1.101 \E -10)_2\).

Gleitpunktzahl mit doppelter Genauigkeit: Eine solche wird als Gleitpunktzahl zur Basis \(2\) mit verändertem Exponenten abgespeichert: \(x = \pm 1 . m_2 m_3 \ldots m_p \cdot 2^{n-1023}\).
Im IEEE-Standard 754 (\(p = 53\) Ziffern) belegt die Zahl \(8\) Byte = \(64\) Bit: \(1\) Bit für das Vorzeichen (\(0\) positiv, \(1\) negativ), \(11\) Bit für den Exponenten und \(52\) Bit für die Mantisse.

0 00000000000 0000 ………0000
VZ Exponent \(n\) Mantisse \(m_2 m_3 \dotsc m_{53}\)

Sonderfälle:   Null: \(n = 0\), \(m_1 = \ldots = 0\);   underflow: \(n = 0\), \(m_1 = 0\);
overflow (Inf): \(n = 2047\), \(m_1 = \ldots = 0\);   NaN: \(n = 2047\), \(m_1 \not = 0\) oder \(m_2 \not = 0\) oder …

Die größte bzw. kleinste positive Zahl ist \(0\;\;11111111110\;\;1 \ldots 1 \approx 1.8 \cdot 10^{308}\) bzw.
\(0\;\;00000000001\;\;0 \ldots 0 \approx 2.2 \cdot 10^{-308}\) (normalisiert ohne underflow).

Will man eine Dezimalzahl in eine Gleitpunktzahl nach IEEE-Standard umwandeln, so muss sie zunächst als Dualzahl darstellen (Summe von Zweierpotenzen), dann sie normalisieren (\(1.m_2 m_3\ldots \cdot 2^x\)), die Mantissenbits aufschreiben (vordere Eins nicht beachten), den Exponenten ausrechnen (\(n = x + 1023\)) und ihn im Dualsystem hinschreiben. Zuletzt muss das erste Bit dem Vorzeichen entsprechend angepasst werden.

Runden, Gleitpunktoperationen und Fehlerfortpflanzung

Runden: Durch Runden wird eine reelle Zahl \(x\) mit der am nächsten liegenden Gleitpunktzahl \(Rx\) approximiert. Der Rundungsfehler kann dargestellt werden als

\begin{align*} Rx - x = \delta x, \qquad |\delta | \le \eps = \frac {\beta ^{1-p}}{2}, \end{align*} wobei \(\beta \) die Basis und \(p\) die Anzahl der Ziffern ist. Die Konstante \(\eps \) ist die Maschinengenauigkeit und ist \(\eps = 2^{-53}\) bei doppelter Genauigkeit. Sie entspricht dem maximalen relativen Fehler bei der Rundung.

Gleitpunktoperationen: Das Ergebnis einer Gleitpunktoperation ist das gerundete Ergebnis der exakten Operation, d. h. \((R \varphi )(x, y, \ldots ) = R(\varphi (x, y, \ldots ))\).
Dabei muss zur Bestimmung von \(R \varphi \) der Wert von \(\varphi \) nur so genau berechnet werden, dass das Ergebnis der Rundung bestimmt werden kann.

Soll bspw. \((x + y) z\) numerisch berechnet werden, so rechnet man \(R(R(Rx + Ry) \cdot Rz)\).

Der relative Fehler bei der Gleitpunktaddition zweier Zahlen \(x, y\) kann durch

\begin{align*} \frac {|R(Rx + Ry) - (x + y)|}{|x + y|} \le \left [1 + \frac {|x| + |y|}{|x + y|}\right ] \eps + \O (\eps ^2) \end{align*} abgeschätzt werden.
Für Summanden mit demselben Vorzeichen ist dies \(\le 2\eps + \O (\eps ^2)\) (kleiner Fehler).
Für \(y \approx -x\) ist allerdings \(\left [1 + \frac {|x| + |y|}{|x + y|}\right ] \ge 2\beta ^{s-1}\), falls die ersten \(s\) Ziffern in der Basis \(\beta \) übereinstimmen. Diese Ziffern verschwinden bei der Addition. Die sog. Auslöschung verursacht daher einen großen Fehler.

Fehlerfortpflanzung: Ist \(\Delta x = \widetilde {x} - x\) der absolute Fehler eines Messwerts (oder einer Nährung \(\widetilde {x} \approx x\)), so gilt für eine stetig differenzierbare Funktion \(f\) und \(|\Delta y| = f(\widetilde {x}) - f(x)\), dass

\begin{align*} |\Delta y| = |f’(x)| |\Delta x| + o(\Delta x). \end{align*} Für den relativen Fehler und \(x, y \not = 0\) gilt entsprechend

\begin{align*} \frac {|\Delta y|}{|y|} = \left (|f’(x)| \frac {|x|}{|y|}\right ) \cdot \frac {|\Delta x|}{|x|} + o(\Delta x). \end{align*} Dabei bezeichnet \(c_r = |f’(x)|\frac {|x|}{|y|}\) die Konditionszahl von \(f\) an der Stelle \(x\). Vernachlässigt man den Term \(o(\Delta x)\), kann man die Verstärkung des absoluten Fehlers abschätzen mit
\(|\Delta y| \le c_a |\Delta x|\), wobei \(c_a \ge \max _{|t - x| \le |\Delta x|} |f’(t)|\) (entsprechend \(c_r = c_a \frac {|x|}{|y|}\) beim relativen Fehler).

implizites Differenzieren: Ist eine Funktion nicht explizit (\(f(x) = \dotsb \)), sondern implizit (z. B. \(x^2 + 3y^2 = 7\)) gegeben, so kann man beide Seiten unmittelbar nach \(x\) differenzieren. Dabei ist zu beachten, dass \(y = y(x)\) von \(x\) abhängt und daher die Kettenregel angewendet werden muss.