4.5 Gleitkommadarstellung

Ein großer Zahlenbereich mit endlich vielen Ziffern

Festkommadarstellungen weisen jeder Stelle immer dasselbe Gewicht zu. Um sehr große und sehr kleine Beträge mit einer begrenzten Stellenzahl zu erfassen, wird bei Gleitkommazahlen zusätzlich gespeichert, an welcher Größenordnung das Komma liegt. Das funktioniert ähnlich wie die wissenschaftliche Schreibweise \(6{,}02\cdot10^{23}\).

Definition 4.4 (Normalisierte Gleitkommazahl). Gegeben seien eine Basis \(b\in\mathbb N\) mit \(b>1\), eine Mantissenlänge \(p\in\mathbb N\) mit \(p\ge1\) und Exponentengrenzen \(e_{\min},e_{\max}\in\mathbb Z\) mit \(e_{\min}\le e_{\max}\). Eine von null verschiedene normalisierte Gleitkommazahl besitzt die Form

\[ x=(-1)^V\,m\,b^e, \]

Dabei ist \(V\in\{0,1\}\) das Vorzeichenbit und \(e\in\mathbb Z\) mit \(e_{\min}\le e\le e_{\max}\) der Exponent. Die Mantisse lautet

\[ m=(m_0,m_1\ldots m_{p-1})_b. \]

Für die Ziffern gilt \(m_0\in\{1,\ldots,b-1\}\) und \(m_j\in\{0,\ldots,b-1\}\) für \(j=1,\ldots,p-1\). Damit ist \(1\le m<b\).

Die endliche Mantissenlänge bestimmt, wie dicht benachbarte Maschinenzahlen bei festem Exponenten beieinanderliegen.

Satz 4.4 (Abstand benachbarter Gleitkommazahlen). Seien \(b\in\mathbb N\) mit \(b>1\), \(p\in\mathbb N\) mit \(p\ge1\) und \(e\in\mathbb Z\) mit \(e_{\min}\le e\le e_{\max}\) fest gewählt. Dann haben benachbarte positive normalisierte Gleitkommazahlen mit diesem Exponenten den Abstand

\[ b^{e-p+1}. \]

Wächst der Exponent um \(1\), wächst auch der Abstand um den Faktor \(b\). Gleitkommazahlen liegen deshalb nicht gleichmäßig auf der Zahlengeraden.

Da Mantisse und Exponent nur endlich viele Bitmuster besitzen, kann ein Computer nur endlich viele Zahlen exakt darstellen. Alle anderen Werte werden auf eine benachbarte Maschinenzahl gerundet. Je größer der Betrag, desto größer ist typischerweise auch der absolute Abstand zwischen benachbarten Zahlen; die relative Genauigkeit bleibt dagegen näherungsweise konstant.

In einem kleinen Dezimalsystem können wir die darstellbaren Zahlen und ihre Abstände vollständig überblicken.

Beispiel: Darstellbare Zahlen auf dem Zahlenstrahl

Wir wählen \(b=10\), \(p=1\) und \(e\in\{-1,0,1\}\). Die positive Mantisse ist eine der Ziffern \(1,\ldots,9\).

Zahlenstrahl der nichtnegativen Zahlen eines Dezimalsystems mit einer Mantissenziffer und Exponenten minus 1, 0 und 1. Zwischen 0,1 und 0,9 beträgt der Abstand 0,1, zwischen 1 und 9 beträgt er 1 und zwischen 10 und 90 beträgt er 10. Eine Vergrößerung zeigt den Bereich von 0 bis 10.

Kleine Beträge sind absolut genauer darstellbar: Die Abstände sind \(0{,}1\), \(1\) beziehungsweise \(10\). Für negative Zahlen ist das Raster spiegelbildlich.

Für nicht exakt darstellbare Zahlen messen wir, wie stark die gespeicherte Näherung vom ursprünglichen Wert abweicht.

Definition 4.5 (Absoluter und relativer Rundungsfehler). Wird eine Zahl \(x\in\mathbb R\setminus\{0\}\) durch die endliche Maschinenzahl \(\operatorname{fl}(x)\in\mathbb R\) ersetzt, heißen

\[ \left|\operatorname{fl}(x)-x\right| \quad\text{und}\quad \frac{\left|\operatorname{fl}(x)-x\right|}{|x|} \]

absoluter beziehungsweise relativer Rundungsfehler.

Schon eine einfache Dezimalzahl kann eine unendliche Binärdarstellung besitzen und deshalb nur näherungsweise gespeichert werden.

Beispiel: Warum \(0{,}1\) im Binärsystem problematisch ist

Die Dezimalzahl \(0{,}1\) besitzt die unendliche Binärdarstellung

\[ (0{,}0001100110011\ldots)_2. \]

Ein binäres Gleitkommaformat muss diese Folge abschneiden und runden. Daher ist der gespeicherte Wert im Allgemeinen nur eine sehr gute Näherung an \(0{,}1\). Das erklärt, warum wiederholtes Addieren von \(0{,}1\) nicht immer exakt beim erwarteten Dezimalwert endet.

Schon bei \(0{,}1+0{,}2\) lässt sich der Unterschied zum erwarteten Dezimalwert \(0{,}3\) nachweisen. Mit 17 Ziffern wird er sichtbar:

# Ergebnis und Vergleichswert mit 17 Ziffern anzeigen
x <- 0.1 + 0.2
sprintf("%.17g", x)     # "0.30000000000000004"
sprintf("%.17g", 0.3)   # "0.29999999999999999"
x == 0.3               # FALSE
x - 0.3                # 5.551115e-17

Im HTW-JupyterHub öffnen

R rundet die Ausgabe normalerweise. Der scheinbare Wert 0.3 verbirgt deshalb die kleine Abweichung; ein exakter Vergleich macht sie sichtbar.

Werden Zwischenergebnisse gerundet, kann schon eine andere Klammerung den Endwert verändern.

Bemerkung: Reihenfolge der Berechnungen

Bei Berechnungen mit Gleitkommazahlen werden Zwischenergebnisse gerundet. Die dabei entstehenden Rundungsfehler können sich je nach Reihenfolge der Teilrechnungen unterschiedlich auswirken.

Deshalb können mathematisch gleichwertige Rechnungen wie \((a+b)+c\) und \(a+(b+c)\) unterschiedliche Ergebnisse liefern. Welche beiden Zahlen zuerst addiert werden, kann also das Endergebnis verändern.

Ein kleiner Summand kann etwa beim Addieren zu einer sehr großen Zahl durch die Rundung verloren gehen. Werden mehrere kleine Summanden zuerst untereinander addiert, kann ihr Beitrag erhalten bleiben.

Numerisch stabile Verfahren ordnen Rechnungen so an, dass unvermeidliche Rundungsfehler möglichst wenig verstärkt werden. Beispielsweise sollten Zahlen ähnlicher Größenordnung bevorzugt miteinander addiert werden. Bei der Subtraktion nahezu gleicher Näherungswerte ist besondere Vorsicht nötig, weil die wenigen verbleibenden Ziffern einen großen relativen Fehler besitzen können.

IEEE 754: Ein gemeinsames Speicherformat

IEEE 754 legt fest, wie binäre Gleitkommazahlen gespeichert und wie Sonderfälle wie Null, Unendlich und ungültige Ergebnisse codiert werden. Ein standardisiertes Format macht numerische Daten zwischen Programmiersprachen, Prozessoren und Dateiformaten austauschbar.

Definition 4.6 (IEEE 754 binary32). Ein 32-Bit-Gleitkommawort besteht aus

\[ \underbrace{V}_{1\text{ Bit}}\; \underbrace{E}_{8\text{ Bit}}\; \underbrace{M}_{23\text{ Bit}}. \]

Dabei gilt \(V\in\{0,1\}\) und \(E\in\{0,\ldots,255\}\). Das Mantissenfeld \(M\) hat 23 Bits mit Ziffern aus \(\{0,1\}\) und einen ganzzahligen Wert aus \(\{0,\ldots,2^{23}-1\}\).

Für \(E\in\{1,\ldots,254\}\) ist der Wert einer normalisierten Zahl

\[ x=(-1)^V\,(1,M)_2\,2^{E-127}. \]

Das Vorzeichenbit ist \(V\), der gespeicherte Exponent ist \(E\) mit Bias \(127\), und \(M\) enthält die Nachkommabits der Mantisse. Die führende \(1\) der normalisierten Mantisse wird nicht gespeichert.

Ist ein Wert in binary32 nicht exakt darstellbar, entscheidet die Rundungsregel, welche der benachbarten Maschinenzahlen gespeichert wird.

Bemerkung: Zur nächsten Zahl runden, im Gleichstand zur geraden

Die Standardrundung in binary32 wählt die nächstgelegene darstellbare Zahl.

Liegt der exakte Wert genau in der Mitte zwischen zwei benachbarten darstellbaren Zahlen, wird die Darstellung gewählt, deren letztes gespeichertes Mantissenbit \(0\) ist (round to nearest, ties to even).

„Gerade“ bezieht sich hier auf den ganzzahligen Wert des Mantissenfeldes \(M\): Eine Binärzahl ist genau dann gerade, wenn ihr letztes Bit \(0\) ist. Diese Regel vermeidet eine systematische Bevorzugung des Auf- oder Abrundens.

An der Aufteilung eines Speicherwortes lassen sich die Aufgaben der drei Bitfelder ablesen.

Bemerkung: Aufbau und normalisierte Zahlen

\[ \begin{array}{c|c|c} \text{Vorzeichen }V&\text{Exponent }E&\text{Mantissenfeld }M\\ \hline 1\text{ Bit}&8\text{ Bit}&23\text{ Bit} \end{array} \]

  • \(V=0\) bedeutet nichtnegativ, \(V=1\) negativ.
  • Der tatsächliche Exponent ist \(e=E-127\).
  • Für \(1\le E\le254\) lautet die Mantisse \((1,M)_2\), mit einer führenden \(1\) vor dem Komma. Diese Zahlen heißen normalisierte oder normale Zahlen. Die führende \(1\) wird nicht mitgespeichert.
  • Die Reihenfolge im Speicher ist \(V\,|\,E\,|\,M\).

Der Bias verschiebt auch negative Exponenten in den Bereich einer vorzeichenlosen 8-Bit-Zahl. Beispielsweise wird \(e=-3\) als \(E=-3+127=124\) gespeichert. Die implizite führende \(1\) schenkt normalisierten Zahlen effektiv ein zusätzliches Präzisionsbit.

Bestimmte Exponentenfelder sind für Werte reserviert, die nicht zur normalisierten Gleitkommadarstellung gehören.

Bemerkung: Null, Unendlich und NaN

Für Sonderwerte sind bestimmte Kombinationen von Exponentenfeld \(E\) und Mantissenfeld \(M\) reserviert:

  • \(E=0\) und \(M=0\): Null; das Vorzeichenbit unterscheidet \(+0\) und \(-0\).
  • \(E=255\) und \(M=0\): Unendlich; \(V=0\) ergibt \(+\infty\), \(V=1\) ergibt \(-\infty\).
  • \(E=255\) und \(M\ne0\): NaN (Not a Number, kein gültiger Zahlenwert).

Die exakte Binärdarstellung von \(13{,}25\) erlaubt eine Codierung ohne Rundungsfehler.

Beispiel: \(13{,}25\) codieren

Die Zahl ist exakt binär darstellbar, weil ihr Nachkommaanteil \(0{,}25=2^{-2}\) ist. Zunächst rechnen wir ins Binärsystem um und normalisieren:

\[ (13{,}25)_{10}=(1101,01)_2=(1,10101)_2\cdot2^3. \]

Die drei Felder erhalten wir daraus wie folgt:

  1. Vorzeichen: Die Zahl ist positiv, also ist \(V=0\).
  2. Exponent: Aus \(e=3\) wird mit dem Bias \(127\) der gespeicherte Exponent \(E=3+127=130=(10000010)_2\).
  3. Mantissenfeld: Die führende \(1\) wird nicht gespeichert. Die fünf Nachkommabits 10101 werden mit 18 Nullen auf 23 Bits ergänzt: \(M=\mathtt{10101000000000000000000}\).

In der Reihenfolge \(V\,|\,E\,|\,M\) lautet die vollständige Bitfolge somit

\[ \boxed{0\;10000010\;10101000000000000000000}. \]

Dieselbe Bitfolge kann kompakt als 0x41540000 geschrieben werden: Jede Vierergruppe entspricht einer Hexadezimalziffer, und 0x kennzeichnet diese Schreibweise.

Genauigkeit und Größenbereich

Mehr Bits für Exponent und Mantisse ermöglichen größere Zahlenbereiche und eine höhere Genauigkeit.

Bemerkung: Speicheraufteilung und Größenbereiche

Format Vorzeichen Exponent Mantissenfeld Bias
binary32 (32 Bit) 1 Bit 8 Bit 23 Bit 127
binary64 (64 Bit) 1 Bit 11 Bit 52 Bit 1023

Die folgenden Grenzen gelten für positive endliche Zahlen:

Format Kleinster positiver Wert Größter endlicher Wert
binary32 \(\approx1{,}401\cdot10^{-45}\) \(\approx3{,}403\cdot10^{38}\)
binary64 \(\approx4{,}941\cdot10^{-324}\) \(\approx1{,}798\cdot10^{308}\)

Die Untergrenzen schließen sehr kleine nicht normalisierte (subnormale) Zahlen ohne führende \(1\) ein. Negative Werte sind spiegelbildlich darstellbar; auch die Null gehört zum Format.

binary32 besitzt bei normalisierten Zahlen 24 signifikante Binärstellen und damit ungefähr sieben verlässliche Dezimalziffern. binary64 verwendet 52 gespeicherte Mantissenbits, elf Exponentenbits und den Bias \(1023\); zusammen mit der impliziten führenden \(1\) stehen etwa 16 Dezimalziffern Genauigkeit zur Verfügung.

Ein größerer Exponentenbereich vergrößert vor allem den darstellbaren Größenbereich. Mehr Mantissenbits verbessern dagegen die Genauigkeit innerhalb einer Größenordnung.

Zusammenfassung

  • Gleitkommazahlen speichern Vorzeichen, Mantisse und Exponent.
  • Kleine Beträge besitzen kleinere absolute Abstände zwischen Maschinenzahlen.
  • Nicht darstellbare Werte werden gerundet; schon \(0{,}1+0{,}2\) kann vom erwarteten Dezimalwert abweichen.
  • Zwischenrundungen können Assoziativ- und Distributivgesetz verletzen.
  • Numerisch stabile Verfahren begrenzen die Verstärkung von Rundungsfehlern.
  • binary32 zerlegt 32 Bits in Vorzeichen, Exponent und Mantissenfeld.
  • Normalisierte binary32-Zahlen verwenden den Bias \(127\) und eine implizite führende \(1\).
  • Spezielle Kombinationen der Felder \(E\) und \(M\) codieren Null, Unendlichkeiten und NaN.
  • binary64 besitzt einen größeren darstellbaren Größenbereich und mehr Mantissenbits als binary32.
  • Mantissenbits bestimmen vor allem die Präzision, Exponentenbits den Größenbereich.