Wie wird ein Dezimalbruch (float) in Binär umgewandelt?
-
Hallo, ich wollte mal Fragen wie ein PC/ Sprache einen Dezimalbruch Umwandelt? Wie diese abgespeichert werden ist mit ja soweit klar, gibt es ja das IEEE format. Nur wie kommt man von
float 0.5 in das Format?
0.5 = 1*2^-1 dann noch Normalisieren. Und hier stellt sich mir die Frage wie kommt ein Rechner auf die Darstellung 0.5 in die Form von Mantisse*2^x
-
naja wenn ich das richtig verstanden habe. Dann kommt der PC von 1*2^-1 auf 0,5 einfach dadurch das er es umschreibt in 1/2, denn 1/2 ist das selbe wie 1*2^-1, einfache potenzgesetze
-
Tobias1984 schrieb:
Nur wie kommt man von
float 0.5 in das Format?
0.5 = 1*2^-1 dann noch Normalisieren. Und hier stellt sich mir die Frage wie kommt ein Rechner auf die Darstellung 0.5 in die Form von Mantisse*2^x
Richtig. Der Rechner rechnet um in 1*2^(-1). 1 ist die Mantisse, -1 der Exponent. 1 ist bereits normiert, also muss nichts mehr getan werden.
Anschaulicher sind Fälle wie 14,5. Das ist die Hälfte von 29. Der Dezimalzahl 29 entspricht die Binärzahl 11101. Um diese Zahl zu halbieren kann einfach das Komma verschoben werden: 14,510 = 1110,12. Diese Bitfolge wird die Mantisse werden, also muss man normieren:
1110,12 = 1,11012 * 2^3Die Mantisse ist also 1,11012 und der Exponent 3. Als float dürfte also sowas herauskommen:
Vorzeichenbit (Plus): 0
Exponent + 127 (Bias): 10000010
Mantisse, abzüglich der führenden Eins: 11010000000000000000000Hintereinandergehängt: 14,510 = 01000001011010000000000000000000float
-
Und wie wird dann float intern dargestellt wenn er sich das aufbereitet als IEE zahl? Ich möchte das nämlich selber Implementieren. Natürlich ohne das ich auf float/double.. zurückgreife. Meine Idee ist, dass eine Zahl Bspw. 52.234375 als String oder 2 Integervariablen vor und nachkomma übergeben wird.
Nur ist meine Frage halt wie ich mit dem Nachkommabereich umgehen soll...
Nehmen wir wieder zum Beispiel 52.234375
dann ist
52 = 110100 0.234375 = 0.001111 -->110100.001111 -->Dann noch normieren.
Meine Idee ist, 234375 solange zu verdoppeln bis vorne eine 1 Steht
234375 468750 -->0 937500 -->0 1875000-->1 1875000 wird 875000 1750000-->1 1750000 wird 750000 1500000-->1 1500000 wird 500000 1000000-->1 1000000 wird 000000
Aber ich weis nicht so recht ob die Idee so elegant ist.
-
TobialsGAST schrieb:
Und wie wird dann float intern dargestellt wenn er sich das aufbereitet als IEE zahl? Ich möchte das nämlich selber Implementieren. Natürlich ohne das ich auf float/double.. zurückgreife. Meine Idee ist, dass eine Zahl Bspw. 52.234375 als String oder 2 Integervariablen vor und nachkomma übergeben wird.
Nur ist meine Frage halt wie ich mit dem Nachkommabereich umgehen soll...
Nehmen wir wieder zum Beispiel 52.234375
dann ist
52 = 110100 0.234375 = 0.001111 -->110100.001111 -->Dann noch normieren.
Bis hierhin dürfte es richtig sin - zum Normieren schiebst du jetzt das Komma vor bis hinter die vorderste 1 und erhältst so 1.10100 001111 * 25. Damit hast du die Mantisse 10100001111 und den Exponenten 5+Bias=132=10000100 - das mußt du jetzt nur noch zusammensetzen zu
0100010 01010000 11110000 00000000 ve m
(die Mantisse wird mit Nullen aufgefüllt auf 23 Stellen)