下面的代碼可以在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
關鍵字,它的工作原理,那麼可能會出現某種優化錯誤?
在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仍然有效嗎?它看起來像視覺 工作室 2008在這個問題比g ++更可靠嗎?
對於所有新的SO用戶:這是您如何提出問題。 +1 – tenfour
FWIW,我用g ++ 4.5.0使用MinGW得到正確的輸出。 –
我得到4.5 4.6的所有情況。你的g ++版本是什麼?我有g ++(Debian 4.3.2-1.1)4.3.2 –