Was ist 1/10 im Binärsystem?

In vielen Programmiersprachen führt das Rechnen mit Dezimalzahlen zu ungenauen Ergebnissen. Als Grund wird in der Regel angeführt, dass sich bestimmte Dezimalzahlen nicht exakt im Binärsystem repräsentieren ließen. Doch warum ist das so?

In Pocket speichern vorlesen Druckansicht 3 Kommentare lesen
Lesezeit: 4 Min.
Von
  • Golo Roden
Inhaltsverzeichnis

In vielen Programmiersprachen führt das Rechnen mit Dezimalzahlen zu ungenauen Ergebnissen. Als Grund wird in der Regel angeführt, dass sich bestimmte Dezimalzahlen nicht exakt im Binärsystem repräsentieren ließen. Doch warum ist das so?

In jedem Zahlensystem gibt es einen Bezug zwischen der Stelle einer Ziffer innerhalb einer Zahl und der Basis des Zahlensystems. Im Dezimalsystem entsprechen die Stellen beispielsweise Potenzen von 10, im Binärsystem Potenzen von 2.

So lässt sich etwa die Zahl 23 im Dezimalsystem folgendermaßen aufschlüsseln:

23 = 2 * 10^1 + 3 * 10^0

Im Binärsystem gilt prinzipiell das Gleiche, nur dass hier mit der Zahl 2 als Basis zu arbeiten ist. Die Zahl 23 entspricht im Binärsystem dem Wert 10111 und lässt sich wie folgt darstellen:

10111 = 1 * 2^4 + 0 * 2^3 + 1 * 2^2 + 1 * 2^1 + 1 * 2^0

Für Dezimalzahlen gilt prinzipiell das Gleiche, nur dass hierbei die Exponenten negativ werden. So lässt sich beispielsweise die Zahl 0,625 im Dezimalsystem wie folgt aufschlüsseln:

0,625 = 6 * 10^-1 + 2 * 10^-2 + 5 * 10^-3

Im Binärsystem gilt für die gleiche Zahl hingegen folgende Darstellung, wobei dem dezimalen 0,625 im Binärsystem der Wert 0,101 entspricht:

0,101 = 1 * 2^-1 + 0 * 2^-2 + 1 * 2^-3

Die Frage liegt nahe, ob sich alle beliebigen Zahlen als endliche Summe von Potenzen der Basis darstellen lassen. Die Antwort lautet, dass das nicht funktioniert, wie man bereits im Dezimalsystem an Zahlen wie 1/3 erkennen kann, die nur mit Hilfe der periodischen Darstellung endlich dargestellt werden können. Der Bruch 1/3 entspricht als Dezimalzahl dem Wert 0,3333333333…

Für welche Zahlen gilt das nun? Die Antwort ist erstaunlich einfach: Es lassen sich all jene Zahlen als endliche Dezimalzahl darstellen, deren Nenner sich aus den Primfaktoren der Basis des Zahlensystems zusammensetzt.

Für das Dezimalsystem sind das die Zahlen 2, 5 und 10. Deshalb lassen sich Brüche wie 1/2, 1/4, 1/5 oder 1/8 als endliche Zahlen darstellen. Die Nenner der Brüche 1/3, 1/6 oder 1/7 hingegen enthalten Primfaktoren, die nicht zu jenen der Basis passen.

Im Binärsystem gilt das Gleiche. Hier ist der einzige Primfaktor der Basis die Zahl 2 selbst, weshalb sich alle Brüche der Form 1/2, 1/4, 1/8, 1/16, … als endliche Zahlen darstellen lassen. Alle anderen Brüche führen zu unendlichen Dezimalzahlen.

Da die im vorigen Beispiel verwendete Zahl 0,625 der Summe der beiden Brüche 1/2 und 1/8 entspricht, war es möglich, sie im Binärsystem als endliche Zahl abzubilden. Bereits für 0,1 funktioniert das allerdings nicht. Daher führt die Verwendung der Zahl 0,1 im Binärsystem zu Rundungsfehlern, was beispielsweise auch für Zahlen 0,2 und 0,3 gilt.

Aus dem Grund ergibt in JavaScript die Summe von 0,1 und 0,2 nicht 0,3, wie man erwarten würde, sondern ein minimal abweichendes Ergebnis:

console.log(0.1 + 0.2);
// => 0.30000000000000004

Das Gleiche gilt jedoch auch für zahlreiche andere Programmiersprachen. Das liegt schlichtweg daran, dass alle diese Sprachen auf dem IEEE 754-Standard aufbauen, der den internen Aufbau von Fließkommazahlen definiert.

tl;dr: Welche Brüche sich in einem Zahlensystem als endliche Dezimalzahlen abbilden lassen, hängt von den Primfaktoren der Basis ab. Im Binärsystem ist der einzige Primfaktor die 2, weshalb man lediglich Brüche wie 1/2, 1/4, 1/8, … endlich darstellen kann. ()