IEEE 754
Der Standard für Gleitkommaberechnungen in Computern
IEEE 754
Der Standard für Gleitkommaberechnungen definiert, wie Computer rationale Zahlen darstellen und mit ihnen rechnen. Warum ist 0.1 + 0.2 nicht genau 0.3? Die Antwort liegt in der binären Darstellung.
Was ist IEEE 754?
IEEE 754 ist ein technischer Standard für Gleitkommaberechnungen, der 1985 vom Institute of Electrical and Electronics Engineers (IEEE) veröffentlicht wurde. Er definiert:
- Formate für Gleitkommazahlen (32-Bit, 64-Bit)
- Darstellung von ±0, ±∞ und NaN (Not a Number)
- Rundungsregeln (z.B. kaufmännisches Runden)
- Ausnahmebehandlung (Division durch Null, Überlauf)
Fast alle modernen CPUs und Programmiersprachen implementieren diesen Standard.
Das berühmte Beispiel
0.1 + 0.2 = 0.30000000000000004
Das liegt daran, dass 0.1 und 0.2 im Binärsystem periodische Brüche sind und nicht exakt dargestellt werden können – ähnlich wie 1/3 im Dezimalsystem.
Warum ist das wichtig?
- Wissenschaft: Berechnungen in der Physik müssen präzise sein
- Finanzen: Rundungsfehler können zu Geldverlust führen
- Spiele: Physik-Engines verlassen sich auf Gleitkommazahlen
- KI/Machine Learning: Training von neuronalen Netzen
Die Grundformel
Eine Gleitkommazahl besteht aus drei Teilen: Vorzeichen (S), Mantisse (M) und Exponent (E)
Single Precision (32-Bit)
Die Darstellung von 3.14159 im IEEE 754-Format
Die verschiedenen Präzisionsstufen
Vorzeichen: 1 Bit
Exponent: 5 Bit (Bias 15)
Mantisse: 10 Bit
Genauigkeit: ~3-4 Dezimalstellen
Einsatz: Grafik, KI (Tensor Cores)
Vorzeichen: 1 Bit
Exponent: 8 Bit (Bias 127)
Mantisse: 23 Bit
Genauigkeit: ~7-8 Dezimalstellen
Einsatz: float in C/Java/Python
Vorzeichen: 1 Bit
Exponent: 11 Bit (Bias 1023)
Mantisse: 52 Bit
Genauigkeit: ~15-16 Dezimalstellen
Einsatz: double in C/Java, float in Python
Spezielle Werte
| Wert | Vorzeichen | Exponent | Mantisse | Bedeutung |
|---|---|---|---|---|
| +0 | 0 | 0 | 0 | Positive Null |
| -0 | 1 | 0 | 0 | Negative Null (existiert!) |
| +∞ | 0 | 255 (alle 1) | 0 | Positive Unendlichkeit |
| -∞ | 1 | 255 (alle 1) | 0 | Negative Unendlichkeit |
| NaN | beliebig | 255 (alle 1) | ≠ 0 | Not a Number (z.B. 0/0) |
0.1 + 0.2 im Detail
Warum ist 0.1 + 0.2 nicht genau 0.3? Weil 0.1 im Binärsystem eine periodische Zahl ist:
0.0001100110011001100110011001100110011001100110011...
Im IEEE 754-Format wird nach 23 bzw. 52 Stellen abgeschnitten – das führt zu Rundungsfehlern.
Lösungsansätze:
- Decimal-Typen: Python:
decimal.Decimal, Java:BigDecimal - Ganzzahlrechnung: Mit Cent statt Euro rechnen (10 Cent = 10, nicht 0.10)
- Toleranzen: Nicht auf exakte Gleichheit prüfen, sondern |a-b| < ε
Praxisbeispiele in verschiedenen Sprachen
Python
# 0.30000000000000004
from decimal import Decimal
Decimal('0.1') + Decimal('0.2')
# Decimal('0.3')
Java
// 0.30000000000000004
BigDecimal bd1 = new BigDecimal("0.1");
BigDecimal bd2 = new BigDecimal("0.2");
System.out.println(bd1.add(bd2));
// 0.3
JavaScript
// 0.30000000000000004
// Mit Toleranz vergleichen
const epsilon = 0.000001;
Math.abs( (0.1+0.2) - 0.3 ) < epsilon;
// true
Wichtige Erkenntnisse
- Gleitkommazahlen sind nicht exakt – sie sind Approximationen
- Niemals auf exakte Gleichheit prüfen:
if (x == 0.1)ist problematisch - Für Finanzberechnungen Decimal-Typen verwenden
- Der Standard ist überall gleich – das Problem tritt in allen Sprachen auf
- IEEE 754 definiert auch Rundungsmodi (z.B. zum nächsten, abrunden, aufrunden)
Weiterführende Themen
Binär, Hexadezimal und Oktal – die Grundlagen.
Zu ZahlensystemenWie CPUs Gleitkommazahlen verarbeiten (FPU).
Zu ProzessorenRichtiger Umgang mit Gleitkommazahlen im Code.
Zur Programmierung