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:

1 / 2 / 3

Kommentare (12)

  1. #1 Eckbert
    September 8, 2011

    Ein interessanter Artikel, den ich als (freiberuflicher) Programmierern gut nachvollziehen konnte. Gerade Vergleiche von zwei Gleitkommazahlen miteinander sind manchmal ein nicht zu unterschätzendes Problem.

  2. #2 rolak
    September 8, 2011

    Schöner Einführungstext – etwas verwirrend mag vielleicht sein, daß im Zuge der Umwandlung von 23.625 von Festkommazahlen die Rede ist, wo doch Fließkomma angesagt ist, oder wurde vorher explizit die Position des ‘Kommas’ im Bitstrom festgelegt. Ist halt nur unnormalisiert bzw ‘wie im täglichen Leben üblich’: Macht 12.95€ 😉
    Was vielleicht noch fehlt, ist der Hinweis daß wegen des hidden bit (der impliziten 1 vor dem Komma) die Null eine besondere Darstellung bekommt. (=>IEEE 754). Habe doch hoffentlich nicht die Einstiegspointe von Teil#2 verraten?

    Nö, Eckbert, gerade Vergleiche sind bei der üblichen Darstellung (biased exp) das Einfachste überhaupt – und komplizierter als eine Subtraktion kann es in keinem Format werden…

  3. #3 Marcus Frenkel
    September 8, 2011

    @rolak
    Doch. Die Pointe wurde jetzt versaut. 😉
    Aber schön, dass jemand mitdenkt. Mal sehen, ob ich die Festkommasache noch besser formulieren kann, danke.

  4. #4 LadyDarknis
    September 9, 2011

    0*2³ = 4 ?? / alles mit 0* = 0 | denke aber das es ehr Schreibfehler sind.
    Also für mich nachvollziehbar da ich Zahlen + PC Freak bin,
    aber für einen ich sag mal Otto-Normal Menschen
    nicht mal ansatzweise Verständlich beschrieben.
    Zumal das Thema eigentlich heißen müsste.
    PC´s können mangels Ressourcen nicht 100% richtig Rechnen.
    Und das ist schon bekannt seit der Zeit wo noch Bugs
    durch die Rechenmaschinen gelaufen sind.

    mfG LadyDarknis

  5. #5 Marcus Frenkel
    September 9, 2011

    @LadyDarknis
    Das “0*2³ = 4” haben Sie falsch interpretiert. Die 4 stammt von der Teilgleichung 1*2², den Teil 0*2³ habe ich beim Summieren weggelassen, da ohnehin 0.

    Könnten Sie näher erläutern, warum die Thematik für einen “Otto-Normal Menschen” “nicht mal ansatzweise Verständlich beschrieben” ist? Ich bin für konstruktive Kritik immer dankbar.

  6. #6 LadyDarknis
    September 9, 2011

    Im Artikel werden Grundlegende Zahllehren so wie PC Kenntnisse vorausgesetzt.
    Das Binäre-System wird nicht einmal Erklärt oder Benannt.
    Genauso ist nicht Erklärt was ein Bit ist oder dieser sich Aufbaut.
    Wo das doch genau der Kern der Problematik ist.

    Sicher ist das alles dann Recht aufwendig,
    aber den interessierten Leser sollte man so wenigstens einen Einstieg geben.
    Erst dann kann dieser Verstehen das eigentlich nicht der Rechner das Problem ist,
    sondern die Beschränktheit der heutigen Möglichkeiten/Mittel/Ressourcen.
    Die gemachten Rechnungen sollten anders dargestellt werden
    zur besseren Nachvollziehbarkeit.(Tabelle)

    p.s. wenn die Rechenmaschinen von heute einfach nicht mehr nur
    das Binäre-System nutzen können ( Strom | kein Strom ) sondern
    ich sag mal 3 Möglichkeiten ( Rot | Gelb | Blau ) könnten diese
    immer noch nicht 100% Richtig Rechen.

    mfG LadyDarknis

  7. #7 Marcus Frenkel
    September 9, 2011

    @LadyDarknis
    Kann es sein, dass Ihnen die vorhergehenden Artikel in diesem Blog entgangen sind, die all das erklären, was Sie anprangern? Einige davon sind sogar in diesem Artikel verlinkt, vielleicht schauen Sie da einfach nochmal drüber.

  8. #8 LadyDarknis
    September 9, 2011

    Wenn Ihre Artikel Aufeinander Aufbauen und ich das Übersehen habe,
    möchte ich mich dafür bei Ihnen Entschuldigen.
    Bitte Sie aber gleichermaßen darum das dann auch zu Schreiben,
    da die Überschrift auf eine Einleitung in ein Thema schließen lässt.
    Auch wer eine bessere Darstellungen so wie Nachvollziehbarkeit
    ihrer Rechnungen doch sehr hilfreich.

    mfG LadyDarknis

    p.s. ich wollte Sie mit meiner Kritik nicht Persönlich Angreifen

  9. #9 Marcus Frenkel
    September 9, 2011

    @LadyDarknis
    Nichts zu entschuldigen, das passiert.
    Die Links auf die Basisthemen sind allerdings, wie ich hoffe, eindeutig genug, dass jemand, der die entsprechenden Artikel noch nicht gelesen hat, beim Aufmerksamen lesen darauf gestoßen wird.

    Einige Rechnungen hätte man vielleicht etwas geschickter darstellen können, ja.

    Und ich habe die Kritik auch nicht als persönlichen Angriff aufgefasst; Kritik ist ja dafür da, dass man sich über das Gedanken macht, was man so von sich gibt – so sie denn in einer vernünftigen Form dargereicht wird (was hier ja der Fall war). Keine Sorge also. 😉

  10. #10 Matthias
    September 15, 2011

    Ich bin weder “Zahlen + PC Freak ” noch mathematisch all zu versiert. Was aber an diesem sehr verständlichen Text so unklar sein soll ist mir ein Rätsel. Natürlich musste ich ein paar Absätze mehrmals lesen, bis ich es verstanden habe. So what! Für Laien wie mich aber wunderbar aufbereitet. Weiter so und Danke dafür!

  11. #11 Axel
    Januar 5, 2015

    Vielen Dank für den Artikel – falls der noch gepflegt wird, eine Verständnisfrage:
    Müsste es nicht statt “Hat der Exponent zum Beispiel den Wert 23, so muss das (gedachte) Komma der gespeicherten Mantisse um 23 Stellen nach rechts geschoben werden” heißen: ” … um 23 Stellen nach links …”?

  12. #12 Marcus Frenkel
    Januar 5, 2015

    “nach rechts” ist schon richtig. Die Schreibweise 2*10^5 bedeutet ja zum Beispiel, das damit eigentlich die Zahl 200000 gemeint ist; von 2.0 ausgehend wird das Komma durch den Exponenten um 5 Stellen nach rechts verschoben, um zur gemeinten Zahl zu gelangen.