Другой результат с плавающей запятой при включенной оптимизации - ошибка компилятора?

Приведенный ниже код работает на Visual Studio 2008 с оптимизацией и без нее. Но это работает только на g ++ без оптимизации (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;
}

Выход должен быть:

4.5
4.6

Но г ++ с оптимизацией (O1 - O3) будет выводить:

4.5
4.5

Если я добавлюvolatile Ключевое слово перед t, это работает, так что может быть какая-то ошибка оптимизации?

Тест на g ++ 4.1.2 и 4.4.4.

Вот результат на ideone:http://ideone.com/Rz937

И вариант, который я тестирую на g ++, прост:

g++ -O2 round.cpp

Чем интереснее результат, даже я включаю/fp:fast вариант на Visual Studio 2008, результат по-прежнему правильный.

Дальнейший вопрос:

Мне было интересно, должен ли я всегда включать-ffloat-store вариант?

Потому что версия g ++, которую я тестировал,поставляется сCentOS/Red Hat Linux 5 и CentOS / Redhat 6.

Я скомпилировал многие из своих программ для этих платформ, и я боюсь, что это вызовет неожиданные ошибки в моих программах. Кажется, немного сложно исследовать весь мой код C ++ и используемые библиотеки, есть ли у них такие проблемы. Любое предложение?

Кто-нибудь интересуется, почему даже/fp:fast включен, Visual Studio 2008 все еще работает? Кажется, что Visual Studio 2008 более надежен в этой проблеме, чем g ++?

Ответы на вопрос(7)

Ваш ответ на вопрос