Um diesem Problem zu begegnen, wurde die Darstellung in Form sogenannter Gleitkommazahlen entwickelt. Wie es der Name schon andeutet, ist hier die Position des Kommas nicht festgelegt, sondern wird in der Zahl selber codiert; durch dieses Vorgehen kann ein weitaus größerer Zahlenbereich abgedeckt werden (was zu anderen Problem führt, aber dazu gleich mehr). Mathematisch gesehen entspricht die Gleitkommadarstellung einer normalisierten Exponentialschreibweise. Wer sich nicht mehr erinnert: eine Zahl in Exponentialschreibweise lässt sich als m * be darstellen, wobei m die sogenannte Mantisse (die eigentliche Zahl), b die Basis (im Dezimalsystem die 10) und e der Exponent ist. Üblicherweise wird die Schreibweise zur Darstellung sehr großer oder sehr kleiner Zahlen verwendet, etwa 12000 = 12.0 * 103 oder 0.001 = 1.0 * 10-3. Von einer normalisierten Exponentialschreibweise spricht man, wenn sich vor dem Komma in der Mantisse lediglich eine einzelne Ziffer ungleich 0 befindet; 12000 müsste hierfür also als 1.2 * 104 geschrieben werden (es gibt auch noch andere Normalisierungsbedingungen, aber die sind hier nicht von Interesse). Im Computer lohnt sich hier nun natürlich, als Basis der Darstellung die 2 zu wählen. Durch die Forderung, dass die Zahl immer normalisiert sein soll, ergibt sich immer die folgende Darstellung (wobei p den Nachkommateil der Zahl beschreibt): 1.p * 2e. Die 1 vor dem Komma ergibt sich automatisch durch die erzwungene Normalisierung: vor dem Komma darf nur eine Ziffer ungleich 0 stehen; da im binären System nur 1 und 0 zur Verfügung stehen, ist die Wahl hier eindeutig.
Jetzt muss diese Zahl nur noch in einer Bitkette codiert werden. Da liegt es nun natürlich nahe, in einem Teil der Bitkette den Exponenten und im zweiten Teil der Bitkette die Mantisse zu hinterlegen. Der IEEE-Standard 754 für Gleitkommazahlen einfacher Genauigkeit (das heißt unter Ausnutzung von 32 Bits) sieht etwa vor, dass für den Exponenten 8 Bit und für die Mantisse 23 der 32 Bit zur Verfügung stehen. Die führende 1 der Mantisse muss übrigens nicht mitgespeichert werden, da sie ja definitiv immer vorhanden ist; es reicht also, sich auf den Nachkommateil zu beschränken. Das eine fehlende Bit (23+8=31) ist übrigens für das Vorzeichen reserviert, damit auch negative reelle Zahlen dargestellt werden können, wobei in der Regel eine 0 für positive Zahlen und eine 1 für negative Zahlen verwendet wird. Die Bits werden in der Reihenfolge Vorzeichen (s) – Exponent (e) – Mantisse (m) abgespeichert, so dass sich für eine 32-Bit-Zahl das folgende Muster ergibt:
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
Bleibt nur noch ein Problem: der Exponent kann positiv sein wie bei der Zahl
12.0 * 103 oder aber negativ wie bei der Zahl 1.0 * 10-3 (beide Zahlen der Einfachheit halber im Dezimalsystem). Bei der Speicherung des Exponenten muss also noch ein Vorzeichen untergebracht werden. Eine Möglichkeit wäre natürlich die bereits bekannte Darstellung im Zweierkomplement, welche allerdings aus gleich noch näher erläuterten Gründen nicht benutzt wird. Stattdessen wird der Exponent mit einem sogenannten Bias gespeichert. Der Bias ist ein vereinbarter, gedachter Wert, welcher bei der Konvertierung einer Zahl in die Bitkette auf den Exponenten aufaddiert wird. Bei einem Bias von zum Beispiel 127 (bei einer Exponentenlänge von 8 Bit) wird für einen Exponenten e = 3 also der Wert 130, für einen Exponenten e = -3 der Wert 124 abgespeichert.
Die Verwendung des Bias hat gegenüber dem Zweierkomplement einen entscheidenden Vorteil, da sie den Vergleich zweier Zahlen erheblich vereinfacht – in dieser Art der Darstellung reicht es, die Bitketten zweier zu vergleichender Zahlen einfach lexikografisch, das heißt Bit für Bit von links nach rechts (unter Ausschluss des Vorzeichenbits), miteinander zu vergleichen.
Damit können wir nun endlich ein kleines Beispiel anschauen. Nehmen wir dazu einmal als darzustellenden Wert die 23.625. Das Vorzeichenbit ist schnell gelöst, das ist nämlich 0 (da wir es mit einer positiven Zahl zu tun haben). Aber wie bringen wir den Rest in eine normalisierte Darstellung? Dazu wandelt man die Zahl zuerst in eine Festkommazahl um, und zwar Vor- und Nachkommateil getrennt voneinander. Die 23 lässt sich ziemlich einfach durch wiederholtes Dividieren durch 2 mit Rest umwandeln; folgende Tabelle zeigt die Rechnung, wobei der errechnete Rest den Vorkommateil in Binärdarstellung (in umgekehrter Reihenfolge) angibt:
Kommentare (12)