簡體   English   中英

調試和發布模式中的不同結果

[英]Different Results in Debug and Release Modes

vector<double> pvec;

double firstnode=0.0;

for(iter2=svec.begin(); iter2!=svec.end(); iter2++)
{
    double price= 0.0;
    string sFiyat = iter2->substr(13);
    stringstream(sFiyat)>>price;
    price=log(price);

    if (iter2==iter)
    {
        firstnode = price;
    }
    price -= firstnode;

    pvec.push_back(price);
}

我得到了上面的代碼,調試和發布模式有一個奇妙的區別。 該算法旨在使向量的第一個元素等於零,然后找出第一個元素與其他元素的對數差異。

在調試模式下,這給出了我想要的結果,並且向量的第一個元素總是等於零。 但是當我切換到釋放模式時,向量的第一個元素等於一些小數字,例如8.86335e-019。

而這還不是全部。 當我把行“cout << price << endl;” 在行“price = log(price);”之后 然后我從發布版本獲得的結果與調試模式中的結果相同。 有什么解釋嗎?

調試浮點堆棧使用FPU中可用的完整80位精度。 釋放模式可執行更高效的64位截斷結果。

使用/ fp修改浮點行為以獨立構建http://msdn.microsoft.com/en-us/library/e7s85ffb%28VS.80%29.aspx請參閱http://thetweaker.wordpress.com/2009 / 08/28 / debugrelease-numerical-differences /以及

您觀察到的一些差異僅僅與顯示精度有關。 在將cout與MSVC調試器顯示的值進行比較之前,請確保將cout設置為完全精度。

嘗試關閉發布版本中的優化...

當您使用浮點計算時,大約8e-19的錯誤就像您得到的那樣接近於零。

您的錯誤小於計算值的十億分之一十億分之一。 那非常接近!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM