2016-04-28 20 views
0

Ich lese über Fließkomma- und Rundungsfehler, die während der Fließkomma-Arithmetik auftreten.Fließkomma-Arithmetik

Ich lese viele Artikel auf IEEE 754-Single Precision/Double Precision-Format. Ich verstehe, dass es Vorzeichen Bit gibt, 8 (oder) 11 Bits des Exponenten und 23 (oder) 52 Bits von Signifikanz zusammen mit implizit führenden Bit.

Ich weiß auch, dass die reellen Zahlen, deren Nenner keine Primzahl Faktor 2 nicht genau darstellbare 0,1 Für Eg sein kann binär ,0001100110011 ist .....

ich verstanden, dass 0,1 + 0,1 + 0,1 ist nicht gleich 0,3 wegen der Anhäufung von Rundungsfehlern.

Auch 0.5 ist im Binärformat genau darstellbar, weil es 1/2 ist. Aber ich verstehe nicht angesichts der oben genannten Anhäufung von Rundungsfehler, warum 0,1 + 0,1 + 0,1 + 0,1 + 0,1 = 0,5?

+0

Wollen Sie damit sagen Sie * nicht * Rundungsfehler beim '0.1' fünfmal Akkumulieren? – MooseBoys

+0

ich bin verwirrt, ob die Anhäufung von Fehler aufgegeben wird, wenn 0,1 5 mal hinzugefügt wird oder irgendeine andere Arithmetik, die zu einer genau darstellbaren Zahl in binär führt, wenn ja warum? – chebus

+0

Nur wenn der neue Wert dazu führt, dass die Ungenauigkeit in der Ungenauigkeit verloren geht. –

Antwort

2

In IEEE754 runden zu nächsten geraden Modi haben Sie einige nette Eigenschaften.
Zuerst für jeden endlichen float x und n < 54, (2^n-1) x + x == 2^n x Siehe Is 3*x+x always exact?

Dann auch Sie haben (2^n + 1) x == 2^n x + x
(solange 2^n + 1 genau darstellbar ist, n < 53).

Mit diesen Eigenschaften haben Sie

  • 0,1 + 0,1 == 2 * 0,1
  • 0,1 + 0,1 + 0,1 == 3 * 0,1
  • 0,1 + 0,1 + 0,1 + 0,1 == 4 * 0,1
  • 0,1 + 0,1 + 0,1 + 0,1 + 0,1 == 5 * 0,1

Das reicht nicht, denn in diesem Stadium 0,1 nicht genau 1/10 ist, so dass nichts beweist, 5 * 0,1 == 0,5.
Zum Beispiel 3 * 0,1! = 0,3 und 5 * 0,3! = 0,15.

Also hier ist es nur Glück, der Rundungsfehler hat vernichtet, anstatt zu kumulieren.
(n * 0,1 == n/10.0) gilt für 65 von 100 für die ganzen Zahlen n von 1 bis 100 (gilt immer für die 7 Potenzen von zwei in diesem Intervall).

+0

Sie meinen also, dass der Fehler für 5 * 0,3 akkumuliert wird, aber durch Rundung dieses Wertes aufgegeben wurde, weil die 53 Bits für den Bruch nicht ausreichend waren und der gerundete Wert genau 0,5 ist, bin ich richtig? Ich konnte nicht bekommen, was Sie mit 7 Potenzen von 2 in diesem Intervall meinen? – chebus

+0

andererseits konnte ich aufgrund dieser Erklärung nicht herausfinden, warum 0,3 + 0,3 jetzt gleich 0,6 ist und 6 * 0,1 nicht gleich 0,6 ist – chebus

1

0,1 in doppelter Genauigkeit ist 0,0001100110011001100110011001100110011001100110011001101 binär. Lassen Sie sich durch die binären Additionen Schritt, um zu sehen, was passiert:

0.0001100110011001100110011001100110011001100110011001101 
+ 
    0.0001100110011001100110011001100110011001100110011001101 
----------------------------------------------------------- 
    0.001100110011001100110011001100110011001100110011001101 (52 sig bits -- OK) 
+ 
    0.0001100110011001100110011001100110011001100110011001101 
----------------------------------------------------------- 
    0.0100110011001100110011001100110011001100110011001100111 (54 sig bits -- must round to 53) 
    0.0100110011001100110011001100110011001100110011001101  (rounded up) 
+ 
    0.0001100110011001100110011001100110011001100110011001101 
----------------------------------------------------------- 
    0.0110011001100110011001100110011001100110011001100110101 (54 sig bits -- must round to 53) 
    0.01100110011001100110011001100110011001100110011001101 (rounded down) 
+ 
    0.0001100110011001100110011001100110011001100110011001101 
----------------------------------------------------------- 
    0.1000000000000000000000000000000000000000000000000000001 (55 sig bits -- must round to 53) 
    0.1              (rounded down) 

Also nur darauf zurückzuführen, wie die Abrundungen angehäuft, 0,1 zugegeben fünfmal 0,5 wurde.

(Ich habe diese Werte von meinem binary converter, binary calculator und floating-point converter.)