我的程序中有一個非常奇怪的錯誤。我無法錯誤可重複的代碼分離,但在我的代碼某個地方有:兩個雙打可以同時平等嗎?
double distance, criticalDistance;
...
if (distance > criticalDistance)
{
std::cout << "first branch" << std::endl;
}
if (distance == criticalDistance)
{
std::cout << "second branch" << std::endl;
}
在調試版本,一切都很好。只有一個分支得到執行。
但是在發佈版本中,所有的地獄都會打散,有時候兩個分支都會被執行。
這是很奇怪的,因爲如果我添加了else條件:
if (distance > criticalDistance)
{
std::cout << "first branch" << std::endl;
}
else if (distance == criticalDistance)
{
std::cout << "second branch" << std::endl;
}
這不會發生。
請問,這可能是什麼原因?我正在使用gcc 4.8.1對Ubuntu 13.10上一個32位電腦。
EDIT1:
我使用預編譯標誌
- -std = GNU ++ 11
- -gdwarf-3
EDIT2:
我不認爲這是由內存泄漏引起的。我用valgrind分析了版本和調試版本,內存分析器跟蹤單元化內存並檢測自修改代碼,我發現沒有錯誤。
EDIT3:
更改聲明
volatile double distance, criticalDistance;
使問題消失。這是否確認woolstar's answer?這是一個編譯器錯誤?
EDIT4:
使用gcc的選項-ffloat店也解決了這個問題。如果我正確理解這是由gcc引起的。
由於四捨五入錯誤,檢查雙打相等通常是不明智的。相反,檢查絕對值是否在一定的容差範圍內。 –
@RobertJacobs謝謝!我意識到這一點。在這種情況下,我想比較嚴格的平等,因爲我比較的數字是從完全相同的計算創建的。 –
你不會說你的發佈版本使用了什麼選項,但它是否包含'-fast-math'? –