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