Länge der Mantisse bestimmen - Resultat ist 24 statt 23

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Länge der Mantisse bestimmen - Resultat ist 24 statt 23

    Hallo zusammen

    Ich soll die maximal Länge der Mantisse einer Gleitkommazahl bestimmen. Als Beispiel nehme ich einfach mal den Typ float. Gemäss IEEE 754 müsste die Mantisse ja die Länge 23 haben, folgender Code liefert mir aber Zahlen mit 24 Nachkommastellen. Frage: Wo ist mein Überlegungsfehler?


    Quellcode

    1. int max_bit = 36;
    2. float term = 1.0;
    3. float sum = 0.0;
    4. for (int i = 0; i < max_bit; i++) {
    5. term = term / 2;
    6. sum = sum + term;
    7. cout << setw(8) << i + 1 << setw(36) << term << setw(36) << sum << endl;
    8. }
    Alles anzeigen



    Die Grenze max_bit ist eine Vorgabe. Folgend die Ausgabe:

    Quellcode

    1. 1 0.5 0.5
    2. 2 0.25 0.75
    3. 3 0.125 0.875
    4. 4 0.0625 0.9375
    5. 5 0.03125 0.96875
    6. 6 0.015625 0.984375
    7. 7 0.0078125 0.9921875
    8. 8 0.00390625 0.99609375
    9. 9 0.001953125 0.998046875
    10. 10 0.0009765625 0.9990234375
    11. 11 0.00048828125 0.99951171875
    12. 12 0.000244140625 0.999755859375
    13. 13 0.0001220703125 0.9998779296875
    14. 14 6.103515625e-05 0.99993896484375
    15. 15 3.0517578125e-05 0.999969482421875
    16. 16 1.52587890625e-05 0.9999847412109375
    17. 17 7.62939453125e-06 0.99999237060546875
    18. 18 3.814697265625e-06 0.999996185302734375
    19. 19 1.9073486328125e-06 0.9999980926513671875
    20. 20 9.5367431640625e-07 0.99999904632568359375
    21. 21 4.76837158203125e-07 0.999999523162841796875
    22. 22 2.384185791015625e-07 0.9999997615814208984375
    23. 23 1.1920928955078125e-07 0.99999988079071044921875
    24. 24 5.9604644775390625e-08 0.999999940395355224609375
    25. 25 2.98023223876953125e-08 1
    26. 26 1.490116119384765625e-08 1
    27. 27 7.450580596923828125e-09 1
    28. 28 3.7252902984619140625e-09 1
    29. 29 1.86264514923095703125e-09 1
    30. 30 9.31322574615478515625e-10 1
    31. 31 4.656612873077392578125e-10 1
    32. 32 2.3283064365386962890625e-10 1
    33. 33 1.16415321826934814453125e-10 1
    34. 34 5.82076609134674072265625e-11 1
    35. 35 2.910383045673370361328125e-11 1
    36. 36 1.4551915228366851806640625e-11 1
    Alles anzeigen



    Danke für eure Hinweise. Ich bin erst morgen wieder zu Hause und weiss nicht, ob ich vorher auf Antworten reagieren kann.
  • Dein Überlegungsfehler ist die implizite 1 der Mantisse.

    Beispiel: Für 0.75 brauchst Du nur eine explizite Mantissenstelle. Vorzeichen: 0, Exponent: 01111110 (=-1), Mantisse: (1)10000000000000000000000. Die erste 1 in Klammern ist nicht explizit gespeichert.

    Also kannst Du in Deiner Zeilenzahl immer einen abziehen. Dann passt es.

    Hier ist ein nettes kleines Applet, das das verdeutlicht.
    Multigrad - 360°-Produktfotografie für den Mac
  • Danke für eure Antworten. Die Überlegung mit den dezimalen Nachkommastellen war natürlich dumm, allerdings bleibt das Problem dasselbe, da ich ja 25 verschiedene Zahlen erhalte. Inzwischen habe ich aber mit Hilfe des Applets bemerkt, dass 0.5 und 1 gleich viele Einsen (nämlich keine) in der Mantisse haben, damit stimmt es wieder.

    Danke nochmals und einen schönen Abend!