Eine Gleitkommazahl oder auch Fließkommazahl (engl. floating point number) ist eine
angenäherte Darstellung einer reellen Zahl. In der Informatik werden Gleitkommazahlen
durch zwei fixed-point Zahlen (Mantisse, Exponent) dargestellt. Die Genauigkeit wird von der Mantisse bestimmt.
Je größer die Mantisse, desto genauer ist die Zahl hinter dem Komma.
Der Exponent bestimmt die Größe des Wertebereichs der Zahl.
Das Sign-Bit ist der dritte Bestandteil einer Gleitkommazahl und gibt an,
ob die Zahl positiv (0) oder negativ (1) ist.
Es gibt für jede Architektur verschiedene Typen von Gleitkommazahlen. Sie unterscheiden sich durch
ihre Anzahl an Bits, die für den Exponenten und die Mantisse verwendet werden.
Im Rechner gibt es diese vier Typen:
Bits
Sign
Exponent
Mantissa
Bias
Name
8
1
4
3
7
Bfloat8
16
1
8
7
127
Bfloat16
32
1
8
32
127
single-precision
64
1
11
52
1023
double-precision
Die Norm für 32 und 64 Bit Architekturen liefert IEEE 754. "IEEE 754 single precision"
benötigt 32 Bit an Speicherplatz. In der Programmiersprache C/ C++ ist dieser
Typ unter dem Namen "float" zu finden.
"IEEE 754 double precision" benötigt
64 Bit Speicher und ist in C/ C++ unter dem Typ "double" zu finden.
Des Weiteren werden im Rechner die Varianten "Bfloat16" und "Bfloat8" behandelt.
Sie benötigen 16 bzw. 8 Bit an Speicherplatz.
Umrechnen von Binär zu Dezimal
Um eine Gleitkommazahl von binäre zu einer Dezimalzahl umzuwandeln, müssen
die folgenden Schritte durchgeführt und beachtet werden.
Sign
Exponent
Mantissa
0
1
0
1
1
1
0
1
0
1
2
3
4
5
6
7
Hier ist exemplarisch eine "Bfloat8" Zahl dargestellt.
Zuerst wird der Wert des Exponenten berechnet. Dafür werden die vier Bits,
die der Darstellung des Exponenten zur Verfügung stehen, als normale binäre Zahl gesehen
und umgerechnet.
10112 = 23 + 0 + 21 + 20 = 112
Nun muss der Exponenten-Bias abgezogen werden, der verwendet wird, um negative
Exponenten zu ermöglichen. Bei "Bfloat8" beträgt dieser Wert 7.
11 - 7 = 4
Damit ist der Exponent 4.
Die Mantisse wird wie Nachkommastellen in der binären SChreibweise berechnet
(Summe von 1/2x).
1012 = 1/2 + 0 + 1/8 = 0,625
Bei Gleitkommazahlen, in diesem Fall bei "Bfloat8", werden nur 3 Bits für die Mantisse
abgespeichert. Trotzdem ist eine Genauigkeit von 4 Bits gegeben. Ein Bit, das "hidden bit",
mit dem Wert eins, ist immer gesetzt.
Die eigentliche Darstellung der Mantisse ist also nicht .1012 sondern 1.1012.
1.1012 = 1 + 1/2 + 0 + 1/8 = 1,625
Damit lässt sich der Wert der Zahl wie folgt berechnen.
1,625 * 24 = 26
Zum Schluss wird das Vorzeichen bestimmt. Das Bit ganz links ist null und somit ist die Zahl positiv.
010111012 = 2610
Besondere Zahlen
Die Null
Im Standard der IEEE 754 ist die Zahl Null vorzeichenbehaftet, das bedeutet es gibt eine "positive Null"
und eine "negative Null". Die Null sieht wie folgt aus:
Sign
Exponent
Mantissa
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
-0
0
1
2
3
4
5
6
7
Infinity
Um den Zahlenwert Unendlich (Inf) zu beschreiben, werden
alle Bits für den Exponenten auf 1 (11111....) und für die Mantisse auf 0 (00000...)
gesetzt.
Es gibt ein positives Unendlich und ein negatives Unendlich.
Sign
Exponent
Mantissa
0
1
1
1
1
0
0
0
+Inf
1
1
1
1
1
0
0
0
-Inf
0
1
2
3
4
5
6
7
NaNs
"Not a Number" wird als Rückgabewert bei verboten Rechnungen, wie die Wurzel aus -1,
zurückgegeben. Um NaN darzustellen sind alle Bits für den Exponenten 1 (11111....)
und in der Mantisse mindestens eine 1 vorhanden (01000...).
Eine mögliche Darstellung für NaN sieht wie folgt aus:
Sign
Exponent
Mantissa
0
1
1
1
1
0
1
0
NaN
0
1
2
3
4
5
6
7
Denormalisierte Zahlen
Bei normalisierten Zahlen gibt es ein extra Bit in der Mantissa, dass immer den Wert eins
besitzt. Diese Eins gibt es nicht bei den denormalisierten Zahlen. Denormalisierte Zahlen
werden verwendet um Werte die nah an der Null liegen genauer darzustellen. Sie
werden durch nur Nullen (00000...) im Exponenten dargestellt.
Eine weitere Besonderheit ist die Berechnung des Exponenten. Obwohl der Exponent
eigentlich 0 - Exponentenbias = -Exponentenbias sein müsste, ist er jedoch nur
-(Exponentenbias - 1). Am Beispiel von Bfloat8 ist der Exponent demnach -6 und nicht
-7. Eine denormalisierte Zahl sieht wie folgt aus: