Fabian O. schrieb:
> Peter schrieb:
>> Yalu X. schrieb:
>>> ist – in 32-Bit-FP gerechnet – leider nicht 6, sondern
>>> 5.99999904632568359375
>> Danke für die schnelle Hilfe. Aber wie kommt man auf die Lösung oben?
>
> Kannst Du einfach am PC ausprobieren:
Genau das habe ich auch gemacht.
Wer's im Detail nachrechnen will:
32-Bit-FP-Zahlen haben nach IEEE 754 eine Mantissengenauigkeit von 24
Bit (davon werden allerdings nur 23 Bit gespeichert, da das
höchstwertige Bit auf Grund der Normierung immer 1 und damit ohne
Informationsgehalt ist).
Im Folgenden sind einzelnen Rechenschritte im Dualsystem dargestellt:
1 | r1 = 56 = 111000.000000000000000000
|
2 | r2 = r1 / 10 = 101.100110011001100110011 Ergebnis wird auf 24 Stellen gerundet
|
3 | r3 = r2 - 5 = .100110011001100110011000 Ergebnis wird auf 24 Stellen aufgefüllt
|
4 | r4 = r3 * 10 = 101.111111111111111111110
|
5 |
|
6 | = 6 - 2 ** (-20) = 5.99999904632568359375
|
Jedes Zwischenergebnis wird entweder auf 24 Stellen gerundet oder mit
Nullen auf 24 Stellen aufgefüllt. Der Rundungsfehler entsteht im zweiten
Schritt, da 56/10 im Dualsystem eine nichtabbrechende periodische
Darstellung hat.
Werner schrieb:
> Ach, kann man jetzt mit float 20 Nachkommastellen darstellen und
> anzeigen?
Klar kann man das.
> Selbst mit double wäre diese printf noch reiner Mumpitz.
Normalerweise ja. Aber hier geht es ja gerade darum, den Rundungsfehler
aufzuzeigen. Und den sieht man erst, wenn man mehr Stellen anzeigen
lässt, als es der Rechengenauigkeit entspricht.