Наведений нижче код працює на 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.
Ось результат на 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 ++?