Siehe http://www.ulthryvasse.de/gleitkommazahlen.html
Zur Erinnerung: Fliesskommazahlen werden als Multiplikation dargestellt. Zum Beispiel 1.4735 * 105.
Oder als exponentielle Zahl dargestellt: 1.4735e5
Fliesskommazahlen werden zur binären Codierung in drei Elemente zerlegt:
Das IEEE-Format definiert, wie die einzelnen Elemente binär codiert werden.
+
= '0' / -
= '1') und entferne das Vorzeichen.Der Bias ist ein Korrekturwert für die binäre Speicherung des Exponenten. Dieser Korrekturwert wird zum Exponenten addiert, wodurch der Exponent in der binären Speicherform immer eine positive Zahl ist. Dadurch muss das Vorzeichen des Exponenten nicht gespeichert werden.
In beiden Beispielen verwenden wir das 32 Bit Short-Format.
Schritt | Beispiel 1: -87900 | Beispiel 2: 934.7531 | |||
---|---|---|---|---|---|
Zwischenresultat | Binäre Speicherung | Zwischenresultat | Binäre Speicherung | ||
1. Vorzeichen codieren und entfernen | 87900 | 1… …. …. …. …. …. …. …. | 934.7531 | 0… …. …. …. …. …. …. …. | |
2. Dezimalpunkt verschieben | Mantisse=879 | Mantisse=9347531 | |||
3. Exponent notieren | Exponent=2 | Exponent= -4 | |||
4. Addiere 127 (Bias) zum Exponenten | Exponent=2+127=129 | Exponent=-4+127=123 | |||
5. Exponent als Binärzahl | 1100 0000 1… …. …. …. …. …. | 0011 1101 1… …. …. …. …. …. | |||
6. Mantisse als Binärzahl | 1100 0000 1000 0000 0000 0011 0110 1111 | 0011 1101 1100 0111 0101 0000 1110 01011) |
Für Fliesskommazahlen im Long-Format gilt das gleiche Vorgehen. Die Unterschiede in der binären Speicherung sind:
Die Umwandlung einer exponentiellen Zahl wie -8.79E2 bzw. -8.79*102 kann über den Umweg einer “normalen” Dezimalzahl erfolgen.
Schritt | Beispiel 1: -8.79E4 | Beispiel 2: 9.347531E2 | |||
---|---|---|---|---|---|
Zwischenresultat | Binäre Speicherung | Zwischenresultat | Binäre Speicherung | ||
0. Umwandlung | -8.79E4 = -87900 | 9.347531E2 = 934.7531 | |||
Nun folgen die Schritte 1-6 von oben. |
Sie können den Umweg über eine Dezimalzahl auch auslassen:
Schritt | Beispiel 1: -8.79E4 | Beispiel 2: +9.347531E2 | |||
---|---|---|---|---|---|
Zwischenresultat | Binäre Speicherung | Zwischenresultat | Binäre Speicherung | ||
1. Vorzeichen codieren und entfernen | 8.79E4 | 1… …. …. …. …. …. …. …. | 9.347531E2 | 0… …. …. …. …. …. …. …. | |
2. Dezimalpunkt verschieben | Mantisse=879 | Mantisse=9347531 | |||
3. Exponent notieren | Exponent=-2 + 4 = 2 | Exponent=-6 + 2 = -4 | |||
4. Addiere 127 (Bias) zum Exponenten | Exponent=2+127=129 | Exponent=-4+127=123 | |||
5. Exponent als Binärzahl | 1100 0000 1… …. …. …. …. …. | 0011 1101 1… …. …. …. …. …. | |||
6. Mantisse als Binärzahl | 1100 0000 1000 0000 0000 0011 0110 1111 | 0011 1101 1100 0111 0101 0000 1110 0101 |
Binäre Zahlen können nur Brüche wie 1/2, 1/4, 1/8, 1/16, … darstellen. Daher kann es zu Rundungsfehlern kommen, wenn diese ins Dezimalsystem übertragen werden. Dies liegt daran, dass zur Darstellung eines Dezimalbruchs relativ viele binäre Stellen benötigt werden.
0.7310 = 10 1110 1011 1000 0101 0001 11112
Somit brauchen wir 26 binäre Stellen um den Bruch korrekt abzubilden. Bei einer Fliesskommazahl im Short-Format (32 Bit) stehen aber nur 23 binäre Stellen für die Mantisse zur Verfügung. Somit könnten wir nur eine Annäherung abspeichern: 0.72999978110
Selbst mit dem Long-Format (64 Bit) stossen wir schnell an Grenzen.