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

时间:2011-06-21 19:33:41

标签: c++ visual-studio-2010 debugging release

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&lt;&lt; price&lt;&lt; endl;”在行“price = log(price);”之后然后我从发布版本获得的结果与调试模式中的结果相同。有什么解释吗?

3 个答案:

答案 0 :(得分:6)

调试浮点堆栈使用FPU中可用的完整80位精度。释放模式可执行更高效的64位截断结果。

使用/ fp http://msdn.microsoft.com/en-us/library/e7s85ffb%28VS.80%29.aspx修改您的浮点行为,使其独立构建<\ n> {<3}}

您正在观察的一些差异仅仅与显示精度有关。在将cout与MSVC调试器显示的值进行比较之前,请确保将cout设置为完全精度。

答案 1 :(得分:2)

尝试关闭发布版本中的优化...

答案 2 :(得分:1)

当你使用浮点计算时,8e-19数量级的错误就像你得到的那样接近于零。

您的错误小于计算值的十亿分之一十亿分之一。那非常接近!