Esto es algo que también me ha picado.
Sí, los números en coma flotante nunca se deben comparar para la igualdad debido a un error de redondeo, y probablemente ya lo sabía.
Pero en este caso, está calculando t1+t2
, y luego lo vuelve a calcular. Seguramente que tiene que producir un resultado idéntico?
Esto es lo que está pasando. Apuesto a que estás ejecutando esto en una CPU x86, ¿correcto? La FPU x86 usa 80 bits para sus registros internos, pero los valores en la memoria se almacenan como dobles de 64 bits.
Por lo tanto, t1+t2
se calcula primero con 80 bits de precisión, entonces - supongo - almacenado en la memoria en sum_2
con 64 bits de precisión - y se produce un redondeo. Para la afirmación, se carga de nuevo en un registro de coma flotante y t1+t2
se calcula nuevamente, nuevamente con 80 bits de precisión. Así que ahora está comparando sum_2
, que previamente se redondeó a un valor de coma flotante de 64 bits, con t1+t2
, que se calculó con mayor precisión (80 bits), y es por eso que los valores no son exactamente idénticos.
Editar Entonces, ¿por qué pasa la primera prueba? En este caso, el compilador probablemente evalúe 4.0+6.3
en tiempo de compilación y lo almacene como una cantidad de 64 bits, tanto para la asignación como para la afirmación.Entonces se están comparando valores idénticos, y la afirmación pasa.
Segunda Edición Este es el código ensamblador generado para la segunda parte del código (gcc, 86), con comentarios - más o menos sigue el escenario descrito anteriormente:
// t1 = 4.0
fldl LC3
fstpl -16(%ebp)
// t2 = 6.3
fldl LC4
fstpl -24(%ebp)
// sum_2 = t1+t2
fldl -16(%ebp)
faddl -24(%ebp)
fstpl -32(%ebp)
// Compute t1+t2 again
fldl -16(%ebp)
faddl -24(%ebp)
// Load sum_2 from memory and compare
fldl -32(%ebp)
fxch %st(1)
fucompp
nota interesante: Este fue compilado sin optimización Cuando se compila con -O3
, el compilador optimiza todos del código de distancia.
Puede consultar también: - [http://stackoverflow.com/questions/21265/comparing-ieee-floats-and-doubles-for-equality](http://stackoverflow.com/questions/21265/ comparing-ieee-floats-and-doubles-for-equality) - [http://stackoverflow.com/questions/17333/most-effective-way-for-float-and-double-comparison](http://stackoverflow .com/questions/17333/most-effective-way-for-float-and-double-comparison) - [http://stackoverflow.com/questions/713763/strange-results-with-floating-point-comparison] (http://stackoverflow.com/questions/713763/strange-results-with-floating-point-comparison) – pingw33n