Conversión implícita doble a int en mingw32

Conversión implícita doble a int en mingw32


No puedo explicar el comportamiento del siguiente programa (compilado con gcc en mingw 32 bits). Soy consciente de la posible pérdida de precisión al convertir implícitamente de doble a int, pero esperaría que los dos casos dieran el mismo resultado ya que está haciendo exactamente las mismas operaciones. ¿Por qué las dos salidas son diferentes?


#include <stdio.h>
#include <math.h>
int main()
{
int table[3] = {2, 3, 4};
int i, N;
N = 0;
N += table[0] * pow(100, 0);
N += table[1] * pow(100, 1);
N += table[2] * pow(100, 2);
printf("%d\n", N);
N = 0;
for(i = 0; i < 3; i++)
N += table[i] * pow(100, i);
printf("%d\n", N);
return 0;
}
//output:
40302
40300

Respuestas:


Con pow(100, 0) pow(100, 1) y pow(100, 2) el compilador reemplaza las llamadas a funciones con constantes (1, 100, 10000 ), pero con pow(100, i) tiene que llamar a la función en tiempo de ejecución (debido a la variable i siendo pasado como argumento), dando como resultado dos resultados de pow en la forma 0.99999999 y 99.999999 en lugar de 1 y 100 (o cualquiera de los 2 de los 3). Al truncar a int después de la multiplicación, "pierdes" dos unidades.


Este es otro ejemplo de por qué convertir a int de double es simplemente pura maldad :muy difícil encontrar errores sutiles en su programa (no errores del compilador).


Por cierto, me sorprende que el compilador con O2 no desenrolló el ciclo, propagó las constantes y alcanzó la misma optimización (reemplazando la llamada a la función con resultados constantes).


Por cierto, borra eso, me sorprende que el compilador no haya reemplazado todo tu código con solo dos llamadas a printf .