El siguiente código funciona en Visual Studio 2008 con y sin optimización. Pero solo funciona en g ++ sin optimización (O0).
#include <cstdlib>
#include <iostream>
#include <cmath>
double round(double v, double digit)
{
double pow = std::pow(10.0, digit);
double t = v * pow;
//std::cout << "t:" << t << std::endl;
double r = std::floor(t + 0.5);
//std::cout << "r:" << r << std::endl;
return r / pow;
}
int main(int argc, char *argv[])
{
std::cout << round(4.45, 1) << std::endl;
std::cout << round(4.55, 1) << std::endl;
}
La salida debe ser:
4.5
4.6
Pero g ++ con optimización ( O1
- O3
) dará como resultado:
4.5
4.5
Si agrego la volatile
palabra clave antes de t, funciona, entonces, ¿podría haber algún tipo de error de optimización?
Prueba en g ++ 4.1.2 y 4.4.4.
Aquí está el resultado en ideone: http://ideone.com/Rz937
Y la opción que pruebo en g ++ es simple:
g++ -O2 round.cpp
El resultado más interesante, incluso si activo la /fp:fast
opción en Visual Studio 2008, el resultado sigue siendo correcto.
Otra pregunta:
Me preguntaba, ¿debería activar siempre la -ffloat-store
opción?
Porque la versión g ++ que probé se envía con CentOS / Red Hat Linux 5 y CentOS / Redhat 6 .
Compilé muchos de mis programas en estas plataformas y me preocupa que causen errores inesperados dentro de mis programas. Parece un poco difícil investigar todo mi código C ++ y bibliotecas usadas si tienen tales problemas. ¿Cualquier sugerencia?
¿Alguien está interesado en por qué incluso /fp:fast
encendido, Visual Studio 2008 todavía funciona? ¿Parece que Visual Studio 2008 es más confiable en este problema que g ++?