[英]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.