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^3

    Die 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: 11010000000000000000000

    Hintereinandergehä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)


Anmelden zum Antworten