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

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

Pi (3.14159)
Eulersche Zahl (2.71828)
0.1 (periodisch)
Große Zahl (1e10)
Kleine Zahl (1e-10)

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
+0000Positive Null
-0100Negative Null
+∞0255 (single)0Positiv unendlich
-∞1255 (single)0Negativ unendlich
NaNbeliebig255 (single)≠ 0Not a Number
Denormalbeliebig0≠ 0Sehr 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