Gleitkommazahlen/ floating-point


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.

Sign (V) * Mantissa (M) * Basis (B) hoch Exponent (E)



Verschiedene Typen


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 23 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:
Sign Exponent Mantissa
0 0 0 0 0 0 1 0
0 1 2 3 4 5 6 7