Problem mit Fließkommazahl
-
Hallo, ich hab gerade mit Kommazahlen rumprobiert und kann mir folgendes nicht erklären:
Ich habe eine Variable vom Typ Float, also 4 Byte oder 32 Bit. Das erste steht für das Vorzeichen, die nächsten 8 für den Exponent und die folgenden 23 Bit für die Mantisse.
Ich habe der Variablen den Wert 0x8000008 zugewiesen. Das bedeutet in der Mantisse sollte dieser Wert gespeichert sein:
1000 0000 0000 0000 0000 0000 1000
Nachdem dieser Wert normalisiert wurde, muss die erste 1 nicht gespeichert werden (Hidden Bit), da implizit festgelegt ist, das hier eine 1 stehen muss.
Das heißt es sollte nur noch dieser Wert gespeichert werden
000 0000 0000 0000 0000 0000 1000
Da nur 23 Bits zur Verfügung stehen, kann in der Mantisse schließlich nur dieser Wert gespeichert werden:
000 0000 0000 0000 0000 0000
Um den Wert wieder zu ermitteln, wird die 1 wieder angefügt (Hidden Bit) und mit 10^Exponent multipliziert. D.h. wir bekommen den dualen Wert
1000 0000 0000 0000 0000 0000 0000 = 134217728 (Basis 10).
Beim ausgeben mit printf wird auch dieser Wert angezeigt.
Das bedeutet doch das die hinteren 4 Bits keine Rolle spielen, da sie nicht abgespeichert werden.
Wiederhole ich das ganze dann mit 0x8000009 (der hinterste Teil ist jetzt 1001) dann hat die Variable nicht wie erwartet wieder den gleichen Wert 134217728 sondern den Wert 134217744 (Basis 2: 1000000000000000000000010000)
warum hat es den 1er, der zuerst an 4er Stelle von Rechts war um eine Stelle nach links verschoben?
Hab ich da irgendwo einen Denkfehler?Vielen Dank schonmal,
Rufus
-
Hast du auch daran gedacht, daß bei der Gleitkomma-Darstellung gerundet werden könnte? (da gibt's verschiedene Ansätze - dein System verwendet offenbar "round to nearest" - Runden zur nächstgelegenen darstellbaren Zahl)
-
das macht natürlich Sinn, danke
gibt es eine Möglichkeit das Verhalten zu ändern?