Saluti a tutti,
usando g++ su Ubuntu, processore Intel Core 2 Duo, ho trovato questo comportamento apparentemente anomalo.
Eseguendo:
double x, y, a;
x = pow(10.0,20.0);
y = -x;
a = 1000.0;
x += a;
printf(" x + y = %f \n", x + y);
Ottengo correttamente come risultato: x + y = 0.000000, in quanto 10^20 sommato a 1000 dà ancora 10^20 in formato ieee 754 double precision a 64 bit (ho controllato bit a bit).
Se però al posto delle ultime due righe metto:
printf(" x + y = %f \n", (a + x) + y);
Allora ottengo correttamente: x + y = 1000.000000
Non riesco a capire il motivo di tale apparente anomalia. Forse i registri per il calcolo delle espressioni hanno più di 64 bit?
Ponendo a = 1 ottengo x+y = 0, a = 10 ottengo x+y = 8, a = 100 ottengo x+y = 96.
Qualcuno sa spiegarmi perché?
Grazie
Michele