IEEE-754-Gleitkomma: Von Bits zu Zahlen
IEEE 754 binary32 und binary64 entschlüsseln: Vorzeichen, biased Exponent, nachgestelltes Signifikandfeld, Sonderwerte, Rundung und nichtassoziative Arithmetik.
Kurzfassung: Für einen normalen Binärwert verwendet IEEE 754 : ein Vorzeichenbit, einen biased Exponenten und ein nachgestelltes Signifikandfeld mit impliziter führender 1. Reservierte Exponentenmuster codieren vorzeichenbehaftete Null, Subnormale, Unendlichkeiten und NaNs. Da die meisten exakten reellen Ergebnisse auf ein endliches Format gerundet werden müssen, sind Gleitkommaaddition und -multiplikation im Allgemeinen nicht assoziativ.
Festkomma-Binärdarstellung funktioniert gut, wenn Bereich und Skalierung bekannt sind. Sie wird unhandlich, wenn eine Berechnung Werte abdecken muss, die um viele Größenordnungen auseinanderliegen. Ein vorzeichenbehafteter 32-Bit-Festkommawert mit 16 Nachkommabits hat beispielsweise eine Schrittweite von und einen Bereich von ungefähr bis .
Gleitkomma ordnet einem Exponenten Bits zu und lässt den Radixpunkt dadurch mit der Größenordnung wandern. IEEE 754 wurde erstmals 1985 veröffentlicht; die aktuelle Revision ist IEEE 754-2019. Der Standard definiert Binär- und Dezimalformate, Operationen, Rundung, Ausnahmen und Austauschverhalten. Eine Implementierung kann aus Hardware, Software oder einer Kombination bestehen; Konformität bedeutet daher nicht, dass jede CPU jedes Format in Silizium enthält.
Warum überhaupt Gleitkomma?
Die wissenschaftliche Schreibweise behandelt auf Papier dasselbe Problem: trennt ein kleines Signifikand von einem großen Exponenten. IEEE 754 ist binäre wissenschaftliche Schreibweise mit strikten Regeln dafür, wie viele Bits jeder Teil erhält und wie sie codiert werden.
Zwei Entwurfsanforderungen prägen das Format:
- Festgelegte Codierungen und Operationen. Für einen mathematischen Wert gibt es nicht nur ein Bitmuster: Null hat zwei Vorzeichen, und NaNs besitzen viele Nutzdaten-Codierungen. Der Standard legt fest, wie Operationen und Vergleiche sie behandeln.
- Implementierbare Arithmetik. Exponentenvergleich und Signifikandausrichtung müssen sich auf endliche Hardware- oder Softwarealgorithmen mit vorgegebenem Rundungs- und Ausnahmeverhalten abbilden lassen.
Die Kompromisse, die beide Ziele ermöglichen – biased Exponenten, implizite führende Bits und Exponentencodes für Sonderzwecke – verleihen IEEE 754 seine charakteristische Form.
Das Layout der einfachen Genauigkeit (32 Bit)
| 31 | 30 ............ 23 | 22 ........................... 0 |
| s | e (8 bits) | m (23 bits) |
| 1 | | |
- Vorzeichenbit : 1 Bit. 0 bedeutet nichtnegativ, 1 bedeutet negativ.
- Exponent : 8 Bit, als vorzeichenlose ganze Zahl mit einem Bias von 127 gespeichert.
- Nachgestelltes Signifikandfeld : 23 Bit. Bei normalen Zahlen speichert es den Bruchteil nach einer impliziten führenden 1.
Für normalisierte Zahlen (den üblichen Fall) lautet der Wert:
Die „“ im Signifikand ist implizit – das Format spart ein Bit, indem es ausnutzt, dass sich jede normalisierte Binärzahl durch die Wahl des Exponenten mit einer führenden 1 schreiben lässt.
Das Layout der doppelten Genauigkeit (64 Bit)
Gleiche Struktur, breitere Felder:
| 63 | 62 ........... 52 | 51 ............................. 0 |
| s | e (11 bits) | m (52 bits) |
- Vorzeichenbit : 1 Bit.
- Exponent : 11 Bit, Bias 1023.
- Nachgestelltes Signifikandfeld : 52 Bit.
Wert (normalisiert):
Bereich: ungefähr bei etwa 15–17 signifikanten Dezimalstellen.
Warum erhält der Exponent einen Bias?
Den Exponenten als statt im Zweierkomplement zu speichern, hat einen subtilen, aber wichtigen Vorteil: Gleitkommavergleiche lassen sich auf einen Ganzzahlvergleich des Bitmusters zurückführen (mit umgedrehtem Vorzeichenbit). Vergleicht man zwei nichtnegative Gleitkommazahlen als vorzeichenlose 32-Bit-Ganzzahlen, ist die größere Gleitkommazahl auch die größere Ganzzahl. Exponenten im Zweierkomplement würden diese monotone Beziehung an der Grenze zwischen positiven und negativen Exponenten zerstören.
Das Exponentenfeld aus lauter Nullen ist für Nullen und Subnormale reserviert, während das Feld aus lauter Einsen für Unendlichkeiten und NaNs reserviert ist. Für binary32 entsprechen normale Exponentenfelder von 1 bis 254 den unverzerrten Exponenten bis .
Die Sonderfälle
| Exponentenbits | Nachgestellte Signifikandbits | Bedeutung |
|---|---|---|
| Alle Nullen | Alle Nullen | (das Vorzeichenbit legt fest, welches) |
| Alle Nullen | Nicht null | Subnormal |
| Beliebig dazwischen | Beliebig | Normalisierte Zahl |
| Alle Einsen | Alle Nullen | |
| Alle Einsen | Nicht null | NaN (Not a Number) |
Null hat zwei Codierungen ( und ). Sie vergleichen sich bei IEEE-Vergleichen als gleich, erzeugen aber bei manchen Operationen unterschiedliche vorzeichenbehaftete Ergebnisse (z. B. , ).
Subnormale (historisch auch Denormale genannt) schließen die Lücke zwischen Null und der kleinsten normalen Zahl. Die implizite führende 1 wird zu 0, und binary32 verwendet einen effektiven Exponenten von . Das sorgt für graduellen Unterlauf: Im subnormalen Bereich bleibt der absolute Abstand konstant, während die relative Genauigkeit in Richtung Null abnimmt.
Unendlichkeit entsteht durch Überlauf oder Division durch Null. Sie propagiert durch die Arithmetik auf die naheliegende Weise: , .
NaN signalisiert eine ungültige Operation: , , . NaN ist ansteckend – jede Arithmetik mit NaN ergibt NaN. Entscheidend ist, dass bei IEEE-754-Vergleichen gilt; deshalb verwenden Test-Suites isnan() statt ==.
Durchgerechnetes Beispiel: 0x40490FDB decodieren
Eine berühmte 32-Bit-Konstante. Binär geschrieben:
0x40490FDB = 0100 0000 0100 1001 0000 1111 1101 1011
Aufgeteilt in Felder:
- Vorzeichen:
0– positiv - Exponent:
1000 0000= – tatsächlicher Exponent - Nachgestelltes Signifikand:
100 1001 0000 1111 1101 1011
Das Signifikand ist , also:
Berechnen Sie den gespeicherten Bruchteil:
Das Signifikand beträgt also . Multiplizieren mit :
Das ist mit der Genauigkeit einfacher Präzision. Die Konstante 0x40490FDB ist die kanonische IEEE-754-Codierung von in einfacher Präzision und erscheint weltweit in numerischen Bibliotheken, GPU-Shadern und Prüfungsaufgaben.
Durchgerechnetes Beispiel: 5.75 codieren
Wandeln Sie in IEEE 754 mit einfacher Präzision um.
Schritt 1: in Binär umwandeln. . . Zusammen: .
Schritt 2: normalisieren. Verschieben Sie den Binärpunkt nach links, bis genau eine Ziffer links davon bleibt:
Der tatsächliche Exponent ist also .
Schritt 3: jedes Feld codieren.
- Vorzeichen: positiv, also .
- Exponent: tatsächlich + Bias = =
1000 0001. - Nachgestelltes Signifikand: Lassen Sie die führende 1 weg und speichern Sie die nächsten 23 Bits:
0111, gefolgt von 19 Nullen, also01110000 00000000 0000000.
Schritt 4: zusammensetzen.
0 | 10000001 | 01110000000000000000000
Hexadezimal: 0x40B80000. Sie können dies überprüfen, indem Sie für dieses Muster den Decodierungsablauf umkehren und genau 5.75 zurückerhalten.
Beachten Sie, dass 5.75 eine exakte Binärdarstellung besitzt – sein Nachkommateil ist eine Summe negativer Zweierpotenzen (). Die meisten Dezimalbrüche haben das nicht. hat in einfacher Präzision die Darstellung 0x3DCCCCCD, die wieder zu decodiert wird und um etwa abweicht. Dieser winzige Fehler ist die Ursache jeder Überraschung der Form „“, auf die Neulinge stoßen.
Rundungsrichtungen
IEEE 754-2019 benennt fünf Attribute für die Rundungsrichtung:
- Auf die nächste Zahl runden, bei Gleichstand zur geraden Zahl (Standard). Runden Sie auf den näheren darstellbaren Wert; bei einem Gleichstand wählen Sie den Wert, dessen niederwertigstes Signifikandbit 0 ist.
- Auf die nächste Zahl runden, bei Gleichstand von null weg. Dieses Attribut ist besonders mit Dezimalarithmetik verbunden und wird nicht von jeder binären Gleitkommaumgebung bereitgestellt.
- In Richtung null runden (Abschneiden).
- In Richtung runden (aufrunden).
- In Richtung runden (abrunden).
Der Standardmodus minimiert statistische Verzerrungen – einfaches „bei 0,5 aufrunden“ führt bei der Aufsummierung vieler Werte zu einer leichten Verzerrung nach oben, während Runden bei Gleichstand zur geraden Zahl sich im Mittel ausgleicht.
Welche Richtungen eine Anwendung auswählen kann, hängt von Sprache, Laufzeitumgebung, Compiler und Hardware ab. Die Reproduzierbarkeit hängt außerdem von der Auswertungsreihenfolge, Zwischenpräzision, fusionierten Operationen, Bibliotheksfunktionen und der Behandlung von Subnormalen ab – nicht nur von der gewählten Rundungsrichtung.
Warum Gleitkommaarithmetik nicht assoziativ ist
Betrachten Sie drei IEEE-754-Werte mit einfacher Präzision: .
: Zunächst ist exakt (die Auslöschung ist sauber). Dann gilt . Endergebnis: .
: Zunächst . Der Exponent von liegt bei etwa 67; der Exponent von ist 0. Die Ausrichtung der Signifikanden verschiebt weit über die Präzision von binary32 hinaus. Nach dem Runden gilt . Dann ist .
Die beiden Klammerungen liefern unterschiedliche Ergebnisse, also ist die Gleitkommaaddition nicht assoziativ. Ob ein Compiler Ausdrücke umklammern darf, hängt von Sprachregeln, Implementierung, Optimierungsflags und der Gleitkommaumgebung ab. Bei reproduzierbarkeitskritischem Code sollten Sie diese Entscheidungen dokumentieren und die tatsächliche Toolchain testen, statt sich auf ein einzelnes Compiler-Flag als allgemeingültige Garantie zu verlassen.
Dieselbe Eigenschaft gilt für Subtraktion (Fälle mit Auslöschung), Multiplikation (extrem kleine Produkte können auf Null unterlaufen) und Division (die Division durch sehr kleine Zahlen kann zu Unendlichkeit überlaufen).
Hardware: die FPU
Ein Hardware-Gleitkommaaddierer führt üblicherweise Schritte wie diese aus; Prozessoren ohne FPU können dieselbe Semantik in Software implementieren:
- Die Felder beider Operanden decodieren.
- Exponenten vergleichen; das Signifikand mit dem kleineren Exponenten um die Differenz nach rechts schieben und dabei ein Guard-, Round- und Sticky-Bit für die Rundung behalten.
- Die ausgerichteten Signifikanden addieren oder subtrahieren (mit einem breiten Adder im Carry-Lookahead-Stil).
- Das Ergebnis normalisieren, indem es nach links geschoben wird, bis eine führende 1 erscheint; den Exponenten entsprechend anpassen.
- Gemäß aktivem Rundungsmodus runden.
- Das Ergebnis im IEEE-754-Format codieren.
Der Datenpfad benötigt Exponentenvergleich, Signifikandausrichtung, Addier-/Subtrahierlogik, Erkennung führender Nullen, Normalisierung, Rundung, Sonderfallbehandlung und Ausnahmeberichterstattung. Die F-Erweiterung von RISC-V definiert binary32-Instruktionen, und D ergänzt binary64; beide sind optional. Das verdeutlicht den Unterschied zwischen einem Standardformat und verpflichtender Hardware.
Der Signifikandpfad verwendet binäre Rechentechniken erneut, doch eine FPU ist mehr als eine Ganzzahl-ALU mit zusätzlicher Verdrahtung: Rundung, gradueller Unterlauf, NaNs, Unendlichkeiten, vorzeichenbehaftete Nullen und Ausnahmen gehören zu ihrem Architekturverhalten.
Breitere Formate
Neben einfacher und doppelter Präzision definiert IEEE 754:
- Halbe Genauigkeit (binary16): 1 Vorzeichenbit + 5 Exponentenbits + 10 nachgestellte Signifikandbits. Sie wird in der Grafik und für numerische Workloads mit reduzierter Präzision eingesetzt.
- Vierfache Genauigkeit (128 Bit): 1 + 15 + 112. Selten; eingesetzt in der numerischen Analyse und einigen Finanzberechnungen.
- bfloat16 (kein grundlegendes IEEE-754-Austauschformat): 1 + 8 + 7. Es bewahrt den zu binary32 ähnlichen Exponentenbereich bei wesentlich geringerer Präzision und ist im maschinellen Lernen weit verbreitet.
Jede Variante wägt für ihren vorgesehenen Workload Bereich gegen Genauigkeit ab.
Häufige Fallstricke
==ohne Fehlermodell verwenden. Ein exakter Vergleich ist für manche Invarianten und diskrete Werte richtig; angenäherte Ergebnisse benötigen eine domänenspezifische absolute/relative Toleranz oder eine Richtlinie in Einheiten der letzten Stelle.- Vergessen, dass
NaN != NaNgilt. Verwenden Sieisnan(), um NaN zu erkennen. - Assoziativität annehmen. Das Umordnen von Summen kann das Ergebnis ändern. Compiler-Flags können unsichere Umklammerungen erlauben; verstehen Sie sie, bevor Sie sie einsetzen.
- Dezimale und binäre Intuition vermischen. besitzt keine exakte endliche Binärdarstellung. Für dezimale Geschäftsregeln sollten Sie skalierte Ganzzahlen, Dezimalgleitkomma oder BCD erwägen und weiterhin an jeder notwendigen Grenze eine Rundung definieren.
- Subnormal-Performance voraussetzen. Manche Prozessoren verarbeiten Subnormale mit voller Geschwindigkeit; bei anderen entsteht ein Nachteil, oder sie unterstützen Flush-to-Zero-Modi. Messen Sie auf dem Zielsystem und bewahren Sie graduellen Unterlauf, wenn die Korrektheit es erfordert.
Verbindung zur weiter gefassten CPU-Architektur
Die Registerorganisation ist ISA-spezifisch. Manche Architekturen verwenden getrennte Registerdateien für Ganzzahlen und Gleitkommazahlen; andere überlappen oder vereinheitlichen Teile ihres Zustands. Laden, Speichern, Konvertierungen, Verschiebungen und Aufrufkonventionen definieren die Grenze.
Für breitere Arithmetik stützt sich die Ganzzahlseite auf Strukturen, die mit dem 8-Bit-Addierer verwandt sind und für den jeweiligen Einsatzzweck skaliert und optimiert wurden. Die Gleitkommaseite ergänzt Ausrichtung, Normalisierung, Rundung, Ausnahmen und Sonderwertbehandlung.
Wie geht es weiter?
Fahren Sie mit Zweierkomplement erklärt für vorzeichenbehaftete Ganzzahlen fester Breite fort und anschließend mit BCD: Grundlagen der binärcodierten Dezimaldarstellung für ziffernorientierte Dezimalcodierung.
Zum Experimentieren auf Bitebene verwenden Sie einen ALU-ähnlichen Datenpfad für die Signifikandarithmetik und modellieren dann Ausrichtung, Normalisierung, Guard-/Round-/Sticky-Bits und die Sonderfälle als getrennte Stufen.
Die normative Referenz ist der aktuelle IEEE-754-2019-Standard für Gleitkommaarithmetik.
