IEEE 754 - Gleitkommazahlen
Warum 0.1 + 0.2 nicht genau 0.3 ist – und wie Computer wirklich rechnen
IEEE 754 - Gleitkommazahlen
Der Standard, der festlegt, wie Computer mit Kommazahlen rechnen
Was ist IEEE 754?
Der IEEE 754 Standard definiert, wie Gleitkommazahlen in Computern dargestellt und verarbeitet werden. Er wurde 1985 verabschiedet und ist heute in fast jeder CPU implementiert.
Eigenschaften
- Binäre Darstellung (Basis 2)
- Vorzeichen, Exponent, Mantisse
- Genormte Rundungsregeln
- Sonderwerte: ∞, NaN, ±0
Formate
- Single Precision (32 Bit) – float
- Double Precision (64 Bit) – double
- Half Precision (16 Bit) – in GPUs
- Quadruple (128 Bit) – selten
1. IEEE 754 Rechner
2. Ergebnisse
Vorzeichen (1 Bit)
Exponent (8 Bit)
Mantisse (23 Bit)
Binär
01000000010010001111010111000011
Hexadezimal
0x4048F5C3
Rundungsfehler
1.2e-7
Erklärung
3.14 wird als 0x4048F5C3 dargestellt. Die tatsächliche gespeicherte Zahl ist 3.1400001049041748. Der Rundungsfehler beträgt 1.2e-7.
3. Das berühmte Beispiel: 0.1 + 0.2
0.1 + 0.2 =
0.30000000000000004
0.30000000000000004
Warum? 0.1 und 0.2 können im Binärsystem nicht exakt dargestellt werden (periodische Brüche). Bei der Addition addieren sich die Rundungsfehler.
Interne Darstellung
0.1 in IEEE 754: 0x3DCCCCCD
0.2 in IEEE 754: 0x3E4CCCCD
Summe exakt: 0.30000000000000004
4. Beispiele
Weitere interessante Beispiele
0.1 (periodisch im Binärsystem)
0.001 (periodisch)
Unendlich (∞)
NaN (Not a Number)
Null (-0 und +0)
5. Sonderwerte in IEEE 754
| Wert | Vorzeichen | Exponent | Mantisse | Bedeutung |
|---|---|---|---|---|
| +0 | 0 | 0 | 0 | Positive Null |
| -0 | 1 | 0 | 0 | Negative Null |
| +∞ | 0 | 255 (single) | 0 | Positiv unendlich |
| -∞ | 1 | 255 (single) | 0 | Negativ unendlich |
| NaN | beliebig | 255 (single) | ≠ 0 | Not a Number |
| Denormal | beliebig | 0 | ≠ 0 | Sehr kleine Zahlen |
Praktische Tipps für Programmierer
- Gleitkommazahlen niemals auf exakte Gleichheit prüfen (if (x == 0.1) ist gefährlich!)
- Stattdessen mit einer Toleranz (Epsilon) vergleichen: if (Math.abs(x - 0.1) < 0.000001)
- Für Geldbeträge Dezimalformate verwenden (z.B. decimal in C#, BigDecimal in Java)
- In Datenbanken: DECIMAL statt FLOAT für Finanzdaten
Single Precision
Double Precision
Rundungsfehler