调试和发布模式中的不同结果

Different Results in Debug and Release Modes

本文关键字:结果 模式 布模式 调试      更新时间:2023-10-16
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调试器显示的值进行比较之前,请确保将其设置为全精度。

尝试在您的发布版本中关闭优化。。。

当您使用浮点计算时,8e-19数量级的误差几乎为零。

您的错误小于计算值的十亿分之一。太接近了!