c - setup - mingw offline installer
Doble a la conversión implícita int en mingw32 (1)
Con pow(100, 0) pow(100, 1) y pow(100, 2) el compilador reemplaza las llamadas de función con constantes ( 1, 100, 10000 ), pero con pow(100, i) tiene que llamar al funciona en tiempo de ejecución (debido a que la variable i se pasa como argumento), con dos resultados de pow en la forma 0.99999999 y 99.999999 lugar de 1 y 100 (o 2 de los 3). Al truncar a int después de la multiplicación, se "pierden" dos unidades.
Este es otro ejemplo de por qué convertir a int desde el double es simplemente un mal : es muy difícil encontrar errores sutiles en su programa (no errores de compilación).
Por cierto, me sorprende que el compilador con O2 no desenrollara el bucle, propagara las constantes y alcanzara la misma optimización (reemplazando la llamada de función con resultados constantes).
Por cierto, me sorprende que el compilador no haya reemplazado todo su código con solo dos llamadas a printf .
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 cuando se convierte implícitamente de doble a int, pero esperaría que los dos casos produzcan el mismo resultado ya que están realizando las mismas operaciones exactas. ¿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