Binärdarstellung von Fliesskommazahlen 1. IEEE 754 Gleitkommazahl im Single-Format So sind in Gleitkommazahlen im IEEE 754-Standard aufgebaut: 31 30 24 23 0 S E E E E E E E E M M M M M M M M M M M M M M M M M M M M M M M Exponent Mantisse Da es für eine Einführung in das Thema etwas unhandlich ist, mit so grossen Binärwerten zu arbeiten, werden wir analog zum IEEE 754-Standard eine 8-Bit Gleitkommazahl definieren, die zwar keinen praktischen Wert hat (der Zahlenbereich ist zu klein) aber wegen ihrer Kürze einfacher im Unterricht zu behandeln sind. 2. Babyfloats Unser neues kleines Zahlenformat soll wie folgt aufgebaut sein: S E E E E M M M Exponent Mantisse Erste Erläuterungen zur Codierung der einzelnen Zahlbestandteile: Negative Zahlen erhalten eine 1 im Vorzeichen-Bit (S=Sign). Bei positiven Zahlen steht dort eine 0. Für die Null erlaubt der Standard sowohl ein positiven als auch ein negatives Vorzeichen. Mit 4 Bits im Exponenten können wir grundsätzlich 2 4 = 16 verschiedene Exponenten darstellen. Jedoch sind die beiden extremen Exponenten 0 und 15 für spezielle Zahlen reserviert und können nicht als Exponenten verwendet werden (später mehr darüber). Bei IEEE 754-Fliesskommazahlen werden negative Exponenten nicht im Zweierkomplement dargestellt sondern werden durch eine einfache Verschiebung des Zahlenbereichs realisiert. Dazu halbieren wir den Bereich der 14 Exponenten in zwei gleich grosse Teile. Statt von 1 bis 14 laufen die echten Exponenten von 6 bis 7. Diese Verschiebung wird in der Fachsprache bias genannt und mit B abgekürzt. 1
Die Mantisse ist die reine Ziffernfolge, aus der eine Zahl (im jeweiligen Zahlensystem) besteht. Im Dezimalsystem haben beispielsweise 0.002357 und 235.7 dieselbe Mantisse 2357. Um die Genauigkeit der Mantisse um eine Stelle zu erhöhen, wendet man einen Trick an. Die Binärzahl wird so weit nach links oder rechts verschoben (Multiplikation oder Division mit 2), bis die führende 1 vor dem Dezimalpunkt steht. Beispiele: 1101.001 1.101001 2 3 0.0001001 1.001 2 4 Die Umwandlung in diese Zahlendarstellung heisst Normalisieren und die derart dargestellten Zahlen werden normalisiert genannt. Berücksichtigt man den Dezimalpunkt, so liegt die Mantisse der normalisierten Zahlen immer zwischen Eins und Zwei. Daher brauchen wir die führende Eins nicht speichern und können sie erst beim Auslesen der Zahl wieder anfügen. Auf diese Weise genügen drei Bits für eine vierstellige Mantisse. Der folgende Abschnitt beschreibt das Normalisieren im Detail. 3. Normalisierte Binärzahlen Als Analogie können wir die wissenschaftliche Darstellung von Dezimalzahlen heranziehen: 1258.23 = 1.25823 10 3 0.00379 = 3.79 10 3 Leider können wir im Dezimalsystem die erste Ziffer nicht einfach weglassen, ohne Informationen über die Zahl zu verlieren. Bei den Binärzahlen steht jedoch immer eine Eins vor dem Dezimalpunkt. Diese Eins können wir weglassen und sparen so ein Bit, das wir für eine weitere Nachkommastelle zur Verfügung haben. 4. Umwandlung einer Dezimalzahl in eine Babyfloat Welche Darstellung hat die Zahl 5.75 10? Vorzeichenbit: Da 5.75 > 0 S = 0. 2
Manitsse: Zuerst wandeln wir den ganzzahligen und den gebrochenen Anteil der Zahl in die Binärdarstellung um: (R steht für Rest, Ü steht für Überschuss) Ganzzahliger Anteil: 5 : 2 = 2 R 1 2 : 2 = 1 R 0 1 : 2 = 0 R 1 Gebrochener Anteil: 0.75 2 = 1 Ü 0.5 0.5 2 = 1 Ü 0 von unten nach oben: 5 10 = 101 2 von oben nach unten: 0.75 10 = 0.11 2 Durch Normalisierung der Binärdarstellung erhalten wir: 5.75 10 = 101.11 2 = 1.0111 2 2 = m b e Lassen wir das erste 1-Bit weg, gewinnen wir die Mantisse M = 0111. Da sie jedoch nicht vollständig in den drei Mantissen-Bits platz hat, müssen wir das Bit ganz rechts abschneiden, was zu M = 011 und einer kleinen Abweichung gegenüber dem wirklichen Zahlenwert führt. Um den Exponenten zu codieren, nehmen wir den echten Exponenten e = 2 von oben und verschieben ihn mit dem Wert des Bias B = 7 in den positiven Bereich: E = e + B = 2 10 + 7 10 = 9 10 = 1001 2 Nun können wir aus S, E und M die IEEE-754-Darstellung der gegebenen Fliesskommazahl zusammensetzen: 5.75 10 0 1001 011 2 5. Umwandlung einer Babyfloat in eine Dezimalzahl Welcher Gleitkommazahl entspricht die Babyfloat-Binärzahl 1 1100 100? Vorzeichen: S = 1 negative Zahl Exponent: E = 1100 = 12 e = E B = 12 7 = 5 zur Erinnerung: Der Bias beträgt B = 7 3
Mantisse: Da der Exponent E weder den Wert 0 noch den Wert 15 hat, liegt kein Spezialfall vor und wir haben es mit einer normalisierten Zahl zu tun. Daher fügen wir links an die codierte Mantisse M = 100 eine 1 an und erhalten: m = 1.M = 1.100 Nun können wir die Zahl in ihrer binären Form zusammensetzen und anschliessend ins Dezimalsystem umwandeln: v = ( 1) 1.1 2 2 5 = ( 1) 110000 2 = ( 1) (32 10 + 16 10 ) = 42 10 6. Die betragsmässig grösste normalisierte Zahl Exponent: Da der grösste Exponent 1111 2 = 15 10 für andere Zwecke reserviert ist (siehe unten), müssen wir uns mit dem zweitgrössten Exponenten E = 1110 2 = 14 10 begnügen. Durch die Verschiebung um B = 7 erhalten wir schliesslich den echten maximalen Exponenten e = E B = 14 7 = 7 Mantisse: Hier gibt es keine Einschränkungen, so dass mit 3 Bits die grösste Mantisse M = 111 beträgt. Da wir im Bereich normalisierter Zahlen sind (0 < E < 15), müssen wir noch eine Eins an die höchstwertige Stelle setzen: Schliesslich erhalten wir m = 1.M = 1.111 v = 1.111 2 2 7 = 11110000 2 = 240 10 da es uns hier um die nur um die im absolutbetrag grössten Zahlen geht, können wir 240 als betragsmässig grösste negative Zahl betrachten. 7. Die betragsmässig kleinste normalisierte Zahl Exponent: Da der kleinste Exponent 0000 2 = 0 10 für andere Zwecke reserviert ist (siehe unten), müssen wir uns mit dem zweitkleinsten Exponenten E = 0001 2 = 1 10 begnügen. Durch die Verschiebung um B = 7 erhalten wir schliesslich den echten minimalen Exponenten e = E B = 1 7 = 6 4
Mantisse: Hier gibt es keine Einschränkungen, so dass mit 3 Bits die kleinste Mantisse M = 000 beträgt. Da wir im Bereich normalisierter Zahlen sind (0 < E < 15), müssen wir noch eine Eins an die höchstwertige Stelle setzen: Schliesslich erhalten wir m = 1.M = 1.000 = 1 v = 1 2 6 = 0.000001 2 = 1 2 6 = 1 64 = 0.015625 damit haben wir auch die betragsmässig kleinste negative Zahl gefunden: 0.015625 8. Die Null Auf der einen Seite gewinnen wir durch die Normalisierung immer eine Binärstelle mehr an Genauigkeit. Andererseits zwingt uns dies mit m = 1.M immer mindestens eine 1 in der Mantisse auf, so dass die Darstellung der 0 auf diese Weise unmöglich wird. Um die Normalisierung zu verhindern wird der Exponent mit dem Wert E = 0 codiert und die Mantisse wird in der Form m = 0.M interpretiert. Dies führt dazu, dass die Null auch als Gleitkommazahl aus lauter Nullen besteht naja nur fast, denn es gibt auch noch die negative Null, welche der Standard nicht verbietet. Somit hat die Null in unserem Babyfloat- Format die Darstellung(en): +0 = 0 0000 000 0 = 1 0000 000 9. Subnormalen Zahlen Wir halten fest, dass mit E = 0000 und M = 000 die Null codiert wird. Was sollen wir nun aber mit den übrigen Mantissen wie M = 100 oder M = 111 machen? Damit sie nicht irgendwie zwischen die normalisierten Zahlen geraten und so ein Durcheinander verursachen, sorgt man dafür, dass sie (betragsmässig) unterhalb der normalisierten Zahlen liegen. Daher auch der Ausdruck subnormale Zahlen. Wie bei der Darstellung der Null bereits erwähnt, zeigt ein Exponent aus lauter Nullen (E = 0) an, dass es sich um eine Zahl handelt, deren Mantisse 5
M in der Form 0.M interpretiert wird. Nun müssen wir nur noch einen geeignete binäre Stellenverschiebung finden, so dass die grösste subnormale Zahlen möglichst bündig unterhalb der kleinsten normalisierten Zahl liegt. Da die betragsmässig kleinste normalisierte Zahl die Darstellung v = 0.000001 2 hat (siehe oben), muss die grösste subnormalen Zahl unterhalb anknüpfen und die Form v = 0.000000111 2 haben. Da unsere Mantisse M = 111 neu als 0.M interpretiert wird, besteht die Verschiebung 0.111 2 0.000000111 2 um 6 Stellen (und nicht um 7, wie man vielleicht naiv denken würde). 10. Unendlich Nachdem wir mit dem Exponenten E = 0 die Zahl Null und die subnormalen Zahlen gewonnen haben, klären wir noch, was es mit dem maximalen Exponenten E = 15 auf sich hat. Die kleinste mit diesem Exponenten darstellbare Mantisse M = 0 wird für Unendlich (Infinity) verwendet. Wieder gibt es zwei Formen: 0 1111 000 = +Infinity 1 1111 000 = -Infinity 11. Zahlen, die gar keine sind Auch hier können wir uns fragen, was wir mit den übrigen Mantissen M zum Exponenten E = 15 anfangen sollen. Die Informatiker haben hier eine besondere Lösung gefunden. Mit den Mantissen M 0 werden Ereignisse anzgezeigt, die es bei korrektem Rechnen nicht geben darf. Beispielsweise könnte man die verbotene Division durch Null durch den Wert v = 0 1111 001 signalisieren. Ebenso könnte man den Versuch, aus einer negativen Zahl die Wurzel zu ziehen mit dem Code v = 0 1111 010 quittieren. Kurz: die mit E = 1111 codierten Zahlen sind gar keine Zahlen und werden als NaN (Not a Number) bezeichnet. Der IEEE 754-Standard unterscheidet übrigens nicht zwischen positiven und negativen NaNs. 6
12. Zusammenfassung Die Definitionen und Überlegungen der letzten Abschnitte lassen sich problemlos auf den echten IEEE 754-Standard übertragen. Gehen wir davon aus, dass eine Gleitkommazahl ein Vorzeichen S aus 1 Bit einen Exponenten E aus w Bits eine Mantisse M aus r Bits hat so ergeben sich die folgenden fünf Fälle: 1. Sind E = 2 w 1 und M 0, so ist v keine Zahl sondern eine NaN. 2. Sind E = 2 w 1 und M = 0, so ist v = ( 1) S Infinity. 3. Ist 0 < E < 2 w 1, so ist v = ( 1) S 1.M 2 E B (mit dem Bias B = 2 w 1 1) 4. Sind E = 0 und M 0, so ist v = ( 1) S 0.M 2 1 B (B = 2 w 1 1 Bias). 5. Sind E = 0 und M = 0, so ist v = ( 1) S 0 7