Zum 3DCenter Forum
Inhalt




Das Floating-Point-Format im Detail

Teil 2 von 3 / 8. März 2004 / von aths / Seite 6 von 13


   Denorms - Eine Besonderheit

Da wir im letzten Teil das Grundprinzip der Floating-Point-Darstellung erläutert haben, können wir uns jetzt auf die Feinheiten stürzen. Im weiteren Verlauf werden wir auch endlich zu den Fragen kommen, die wahrscheinlich am meisten interessieren: "Wie genau" sind FP-Formate eigentlich, und wie sind FP24 und FP32 aufgebaut? Zuvor noch eine Bemerkung: "Floating Point" wäre korrekt mit "Gleitkomma" übersetzt. Wir nutzten wiederholt die eingebürgerte, aber streng genommen falsche übersetzung "Fließkomma". In deutschsprachiger Literatur wird das Komma meistens fließend dargestellt, obwohl es natürlich nicht fließt, sondern hin- und hergleitet.

Zum Einsteig möchten wir Eigenarten untersuchen, die man nur bei Gleitkomma-Darstellungen findet. Für unser Beispiel definieren wir ein extrem kleines FP-Format, und zwar FP5 mit 3e2. Also kein Vorzeichen, 3 Bit Mantisse und 2 Bit Exponent. Als Bias legen wir -2 fest. Bei 5 Bit Breite gibt es nur 32 unterschiedliche Werte, die man schnell ausrechnen kann:

0,25000   0,28125   0,31250   0,34375   0,37500   0,40625   0,43750   0,46875
0,50000   0,56250   0,62500   0,68750   0,75000   0,81250   0,87500   0,93750
1,00000   1,12500   1,25000   1,37500   1,50000   1,62500   1,75000   1,87500
2,00000   2,25000   2,50000   2,75000   3,00000   3,25000   3,50000   3,75000

Wir haben eine extra Seite eingerichtet, wo gezeigt wird, wie man auf diese Werte kommt. Wenn noch nicht so richtig klar ist, wie Floating-Point-Zahlen funktionieren, besteht damit die Gelegenheit, ein äußerst übersichtliches FP-Format vorgerechnet zu bekommen.

Was ist die kleinste darstellbare Zahl mit unserem Format? Die 0,25. Ab 0,25 wird relativ fein abgestuft, aber wir haben ein Loch um die Null. Noch schlimmer: Die Null selbst können wir gar nicht darstellen! Dass man die Null nicht direkt speichern kann, ist verständlich: Wir setzen ja bei der Mantisse stillschweigend voraus, dass sie die Nachkomma-Stellen für einen mit "1," beginnenden Faktor darstellen. Und da kann man das Komma noch so weit verschieben, sofern irgendwo eine Eins im Spiel ist, lässt sich nie die Null erreichen. Die nicht darstellbare Null und auch das Loch um sie herum bekommt man in den Griff, wenn die Transistoren ausreichen, einen Spezialfall zu implementieren: Wenn der physikalische Exponent 0 ist, wird die Mantisse nicht um "1," ergänzt. Dann spricht man von einer denormalisierten Mantisse (einem "Denorm").

Ohne Denorm-Support ist der kleinste logische Exponent bei unserem FP5-Beispiel -2. Sofern man Denorms unterstützt, muss auf diese Mantisse der zweitkleinste logische Exponent angewendet werden, bei FP5 also nicht -2, sondern -1. Ansonsten bekäme man ein neues "Loch". Auf einer weiteren extra Seite haben wir unser Beispiel noch einmal mit Denorms durchgerechnet.

Um den Effekt der denormalisierten Speicherung zu illustrieren, sehen wir uns die darstellbaren Werte des FP5-Formats auf dem Zahlenstrahl an:

Auf der Strecke sind alle Werte eingezeichnet, die mit unserem "FP5" dargestellt werden können. Hellgrau der Bereich, der ohne Denorms nicht darstellbar ist - kleiner als 0,25 kommen wir hier nicht. Ab 0,25 beträgt die Schrittweite zunächst 0,03125. Werden Denorms unterstützt, beträgt die Schrittweite bei 0,25 zwar nur 0,0625, dafür können wir auch Zahlen kleiner 0,25 speichern. Das gleiche Prinzip, nur mit anderen Werten, gilt für FP16.

Die Null ist nun auch direkt speicherbar. Aber auch, wenn keine Denorms unterstützt werden, gibt es eine Null. In diesem Falle wird zunächst anhand des Exponenten geprüft, ob eigentlich ein Denorm vorliegt. Falls ja, wird die Zahl gleich auf Null abgeschnitten, so dass Exponent und Mantisse durchweg auf 0 gesetzt sind.

Dem aufmerksamen Leser wird aufgefallen sein, dass man mit FP-Zahlen die Null gleich zweimal kodieren kann: Einmal als +0, einmal als -0, je nach dem, wie das Vorzeichenbit gesetzt wird. Bei vorzeichenbehafteten Integer-Formaten umging man das ja mit der Zweierkomplement-Darstellung, welche beim Floating-Point-Format jedoch keine Verwendung findet. In der Tat untertützen Fließkomma-Zahlen sowohl +0, als auch -0. Dieser Test hier ergibt trotzdem immer true:

if (+0.0 == -0.0)

Bei Vergleichen macht es also keinen Unterschied, ob +0 oder -0. Natürlich wäre jetzt noch die Frage zu klären, wie es denn nun beim FP-Format mit der Verteilung des Quantisierungs-Fehlers aussieht.

Klicken für großes Bild
Blau: Die Zahlen-Werte; Grün: die Abstände zwischen den Zahlenwerten; Rot: Der relative Fehler. In Denorm-Bereich ist der relative Fehler sehr groß, ansonsten jedoch gleichmäßiger als bei Fixpoint-Zahlen (Klicken für großes Bild).

Die Fehler-Balken sind hier von vornherein kleiner, weil das Diagramm jetzt auf 4,0 (und nicht auf 1,0) normalisiert ist. Abgesehen vom Denorm-Bereich stellt man fest, dass die absoluten Fehler (grüne Balken) jetzt nach und nach größer werden, und der relative Fehler (rot) gleichmäßiger verteilt ist, als bei Fixpoint. Die Abstände zwischen den Zahlen werden von Bereich zu Bereich übrigens exponentiell größer.

Bei Fixpoint heißt ein zusätzliches Bit entweder doppelte Nachkomma-Genauigkeit oder bis doppelt so große Zahlen darstellen zu können. Ergänzt man ein FP-Format um ein Bit in der Mantisse, löst man die Zahl doppelt so fein auf - egal, in welchem Bereich man sich gerade befindet, große und kleine Zahlen profitieren gleichermaßen davon. Die Frage, welche Auswirkungen die Ergänzung des Exponenten um ein Bit hat, soll vorerst aufgeschoben werden.






Kommentare, Meinungen, Kritiken können ins Forum geschrieben werden - Registrierung ist nicht notwendig Zurück / Back Weiter / Next

Shortcuts
nach oben