Нижеприведенный код работает в 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
Но g++ с оптимизацией (O1
- O3
) выведет:
4.5
4.5
Если я добавляю ключевое слово volatile
до t, он работает, может быть, есть какая-то ошибка оптимизации?
Тест на g++ 4.1.2 и 4.4.4.
Вот результат на идеоне: 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.
Я собрал многие из моих программ на этих платформах, и я беспокоюсь, что это вызовет неожиданные ошибки внутри моих программ. Кажется, немного сложно исследовать все мои С++-коды и используемые библиотеки, есть ли у них такие проблемы. Любое предложение?
Любое интересует, почему даже /fp:fast
включен, Visual Studio 2008 все еще работает? Похоже, что Visual Studio 2008 более надежна в этой проблеме, чем g++?