Diferentes resultados de coma flotante con optimización habilitada - error del compilador?

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

But g ++ con optimización O1 - O3) generará:

4.5
4.5

Si agrego elvolatile palabra clave antes de t, funciona, ¿podría haber algún tipo de error de optimización?

Test en g ++ 4.1.2 y 4.4.4.

Aquí está el resultado en ideone:http: //ideone.com/Rz93

Y la opción que pruebo en g ++ es simple:

g++ -O2 round.cpp

El resultado más interesante, incluso enciendo/fp:fast opción en Visual Studio 2008, el resultado sigue siendo correcto.

Otra pregunta

e preguntaba si debería encender siempre la-ffloat-store ¿opción

Porque la versión de g ++ que probé esenviado 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 las bibliotecas utilizadas si tienen tales problemas. ¿Cualquier sugerencia

¿Alguien está interesado en por qué incluso/fp:fast activado, Visual Studio 2008 todavía funciona? Parece que Visual Studio 2008 es más confiable en este problema que g ++?

Respuestas a la pregunta(7)

Su respuesta a la pregunta