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.

Single Precision Double Precision Binär Rundungsfehler

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

// In JavaScript, Python, Java, C++ ...
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

(-1)^S × M × 2^(E - Bias)

Eine Gleitkommazahl besteht aus drei Teilen: Vorzeichen (S), Mantisse (M) und Exponent (E)

Single Precision (32-Bit)

Vorzeichen (1 Bit)
0
Exponent (8 Bit)
1
0
0
0
0
0
1
1
Mantisse (23 Bit)
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0

Die Darstellung von 3.14159 im IEEE 754-Format

Die verschiedenen Präzisionsstufen

Half Precision (16-Bit)

Vorzeichen: 1 Bit

Exponent: 5 Bit (Bias 15)

Mantisse: 10 Bit

Genauigkeit: ~3-4 Dezimalstellen

Einsatz: Grafik, KI (Tensor Cores)

Single Precision (32-Bit)

Vorzeichen: 1 Bit

Exponent: 8 Bit (Bias 127)

Mantisse: 23 Bit

Genauigkeit: ~7-8 Dezimalstellen

Einsatz: float in C/Java/Python

Double Precision (64-Bit)

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
+0000Positive Null
-0100Negative Null (existiert!)
+∞0255 (alle 1)0Positive Unendlichkeit
-∞1255 (alle 1)0Negative Unendlichkeit
NaNbeliebig255 (alle 1)≠ 0Not 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.1 in Binär (periodisch)
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.1 + 0.2
# 0.30000000000000004

from decimal import Decimal
Decimal('0.1') + Decimal('0.2')
# Decimal('0.3')

Java

System.out.println(0.1 + 0.2);
// 0.30000000000000004

BigDecimal bd1 = new BigDecimal("0.1");
BigDecimal bd2 = new BigDecimal("0.2");
System.out.println(bd1.add(bd2));
// 0.3

JavaScript

console.log(0.1 + 0.2);
// 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

Zahlensysteme

Binär, Hexadezimal und Oktal – die Grundlagen.

Zu Zahlensystemen
Prozessoren

Wie CPUs Gleitkommazahlen verarbeiten (FPU).

Zu Prozessoren
Programmierung

Richtiger Umgang mit Gleitkommazahlen im Code.

Zur Programmierung