w64 setup descargar compiler c mingw32

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