Informatik : Float

Interaktive Visualisierung

Die Gleitkommazahl (auch Fließkommazahl oder kurz float von engl. floating point number) verwendet 32 Bits (4 Bytes) zum Speichern einer reellen Zahl bzw. eines Näherungswertes der Zahl. Jedes Lämpchen steht für ein Bit (0 = aus, 1 = leuchtet). Die Bits sind in drei Bereiche unterteilt: Vorzeichen, Exponent und Mantisse. Die genaue Interpretation hängt vom verwendeten System bzw. Format ab. Das Beispiel hier bezieht sich auf die MI (Maschine für die Informatikausbildung). normalisiert2127 - 1270Zahl = ( 1 + 0 )201

Erklärung

Eine einfache Möglichkeit der Darstellung von Dezimalbrüchen kennt man aus der Grundschule als Stellenwerttafel:

THZEzh
020406204,06
9460109460,10
0000050,05
Stellenwerttafel

Könnten wir in einer Speicherstelle eine Ziffer (0 bis 9) speichern, dann bräuchten man für jede Zahl in dieser Tabelle sechs Speicherstellen. Die Wertigkeit jeder Ziffer ergibt sich aus der Speicherstelle: Tausender (T), Hunderter (H), Zehner (Z), Einer (E), Zehntel (z) und Hunderstel (h). Dieses Verfahren nennt man Festkommazahl. Benötigt man nur Zahlen in dieser Größenordnung (z. B. Kassensystem), ist das eine praktikable Art der Speicherung. Für einen größeren Zahlenbereich bei gleichem Speicherbedarf bietet sich die Gleitkommazahl an (der Exponent bestimmt, wo das Komma am Ende steht → das Komma kann also gleiten), wie man es aus dem wissenschaftlichen Umfeld her kennt:

eEzhtht
2204062,0406 ⋅ 102204,06
3946019,4601 ⋅ 1039460,10
0005000,05 ⋅ 1000,05
Gleitkommazahlen

In diesem Fall wird eine Speicherstelle für den Exponenten (e) reserviert. Daher können wir nur noch fünf (aufeinanderfolgende) Ziffern einer Zahl speichern. Die Vereinbarung, dass auf der Einer-Stelle keine Null stehen darf, nennt man Normalisierung. Man sieht, dass die Zahl in der letzten Reihe nicht mehr normalisiert ist. Warum Normalisierung? Stellen Sie sich vor, Sie wollen wissen, wie viel 500000 Reiskörner wiegen, wenn ein Reiskorn etwa 0,00002 kg wiegt. Sie fangen vermutlich jetzt an, die Nullen zu zählen. In normalisierter Schreibung lautet die Frage: Wie viel wiegen 5 ⋅ 105 Reiskörner, wenn ein Reiskorn 2 ⋅ 10-5 kg wiegt? Antwort: 10 kg.

Frage. Warum lässt sich die letzte Zahl nicht normalisiert darstellen?

Weil wir nur die Ziffern 0 bis 9 in der Speicherstelle des Exponenten speichern können. Um 0,05 normalisiert zu schreiben, müsste man −2 als Exponent abspeichern können: 5,0 ⋅ 10−2.

Nehmen wir die gespeicherte Zahl direkt als Exponent, so können folglich keine negativen Exponenten entstehen. Wir interpretieren daher den in (e) gespeicherten Wert wie folgt:

e0123456789
e − 4−4−3−2−1012345
Interpretation von e

Mit der Vereinbarung, dass der Exponent der um 4 verminderte Wert aus e ist, können wir nun alle drei Zahlen normalisiert darstellen:

eEzhtht
6204062,0406 ⋅ 102204,06
7946019,4601 ⋅ 1039460,10
2500005,0 ⋅ 10−20,05
Normalisierte Zahlen

Übung. Berechnen Sie die kleinste und größte so darstellbare Zahl und vergleichen Sie diese mit den entsprechenden Zahlen bei der Festkomma-Variante! Überlegen Sie, welches Problem sich für die Null ergibt!

Kleinste Zahl: Da wir normalisiert keine Null bei der Einer-Stelle schreiben dürfen, ist die 1 die kleinste mögliche Ziffer. Bei den Nachkommastellen schreiben wir überall 0. In der Exponenten-Stelle speichern wir 0. Größte Zahl: Wir schreiben überall die Ziffer 9 in die Speicherstellen.
eEzhtht
0100001,0 ⋅ 10−40,0001
9999999,9999 ⋅ 105999 990
Kleinste und größte normalisierte Zahl
Bei der Festkomma-Variante wäre 0,01 und 9 999,99 die kleinste und die größte Zahl. Die kleinste und größte Gleitkommazahl ist also um den Faktor 100 kleiner bzw. größer als die entsprechende Festkommazahl. Die größte Festkomma-Zahl könnte man jedoch nicht mehr exakt als Gleitkommazahl darstellen! Wir müssten also runden (Fehlerquelle):
eEzhtht
8100001,0 ⋅ 10410 000
Näherungswert für die größte Festkommazahl
Das Problem mit der Null ist, dass sich diese nie normalisiert darstellen lässt.

Nun wird es komplizierter, da wir unsere Zahlen im Binärsystem speichern wollen. Zusätzlich führen wir nun auch ein Vorzeichen-Bit ein. Im Tabellenkopf schreiben wir den dezimalen Wert der Speicherstelle. In eine Speicherstelle können wir aber nun nur noch 0 oder 1 speichern. Wir erweitern den Speicherplatz für eine Zahl auf acht Speicherstellen (Bits) und stellen dem Exponenten drei Bits zur Verfügung. Eine Zahl benötigt in diesem Fall also genau ein Byte zum Speichern. Da der Exponent e von 0 = 0002 bis 7 = 1112 gehen kann, ziehen wir immer 3 vom Wert ab, um den eigentlichen Exponenten zu erhalten:

VZExponent eZahl (Mantisse)
−142110,50,250,125RechnungDezimalzahl
01011010(1 + 0,25) ⋅ 225
10011000−1 ⋅ (1 + 0) ⋅ 2−2−0,25
10110010−1 ⋅ (0 + 0,25) ⋅ 20−0,25
1 Byte Gleitkommazahl

Die letzten beiden Zeilen ergeben die gleiche Zahl. Das ist ungünstig! Warum konnte das eintreten? Weil die letzte Zeile die Vereinbarung der Normierung verletzt hat! Wenn wir aber nur normierte Zahlen zulassen und auf der Einer-Stelle außer der 1 sonst keine Ziffer stehen kann, wäre es eine Speicherverschwendung, wenn wir zwar eine Speicherstelle für die Einer haben, aber dort nie etwas anderes als die 1 stehen wird. Daher sparen wir uns das Speichern der Einer-1 und denken uns das einfach jedesmal dazu. Dadurch haben wir ein Bit mehr für die Nachkommastellen zur Verfügung, wodurch sich die Genauigkeit erhöht:

VZExponent eZahl (Mantisse)
−14210,50,250,1250,0625RechnungDezimalzahl
01010100(1 + 0,25) ⋅ 225
10010000−1 ⋅ (1 + 0) ⋅ 2−2−0,25
1 Byte Gleitkommazahl ohne Einer-Bit

Fortsetzung folgt...