2016-06-15 11 views
0

ich versuche, in der folgenden Situation zu verstehen, warum ich nicht einen Überlauf erhalten:Warum kein Überlauf bei Verwendung der Doppelvariablen?

double x = 1.7976931348623157E+308; //this is the max value of double 

x = x + 0.5; 

Bei der Überprüfung der Wert von x bekomme ich immer noch die same result nach Zugabe von 0,5.

Jeder?

+2

Obwohl "* double *" ist die Präzision *** *** begrenzt. – alk

+1

Bis zu dem Zeitpunkt, an dem '0.5' für das Addieren ausgerichtet wurde, wird seine Signifikanz durch Verschieben der Mantisse (um die Exponenten anzupassen) verloren gehen, so dass es nur '0' addiert. –

+0

Wenn in der Mantisse 52 Bits vorhanden sind, geschieht dies, wenn sich die Exponenten der beiden Operanden um mehr als 52 unterscheiden. Dies ist der Fall für Addition oder Subtraktion. Beim Multiplizieren und Dividieren ist das eine andere Sache. –

Antwort

0

Im Allgemeinen, wenn Sie einen Wert zu einem Doppel x hinzufügen möchten, sollte der hinzugefügte Wert innerhalb des Genauigkeitsbereichs sein, damit er den Wert überhaupt ändert.

Für eine double erhalten Sie eine Genauigkeit von ~ 16 Ziffern. Wenn also der addierte Wert kleiner als (x/1E + 16) ist, wird das Ergebnis nicht geändert.

Mit ein wenig Versuch und Irrtum, in Ihrem Fall, einen Wert von , zu dem gegebenen Doppel, gibt ein Ergebnis von + INF.

double x = 1.7976931348623157E+308; //this is the max value of double 

x = x + 1E+292; 
printf ("\nx = %lf",x); 

Ergebnis

x = 1. # INF00

0

die Analogie mit Exponenten-Darstellung in Betracht.

Angenommen, Sie haben 4 gültige Ziffern, so wird die Nummer 1234000.0 durch 1.234e6 dargestellt.

Versuchen Sie jetzt, 0.5 hinzuzufügen, die 1234000.5 sein sollte.

Auch wenn der Zwischenpuffer groß genug ist, um diese Signifikanz zu halten, ist seine Darstellung innerhalb der verbotenen Grenze immer noch 1.234e6.

Aber wenn der Zwischenpuffer halten kann, sagen wir, nur 7 Ziffern, sind die ausgerichteten Werte hinzufügen

1234000 
     0 
------- 
1234000 

so die 0.5 seine Bedeutung verliert, noch bevor die Zugabe durchgeführt wird. Im Fall von double können Sie ziemlich sicher sein, dass der Zwischenpuffer 308 Stellen nicht äquivalent halten kann.