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

hal*_*lak 4 c++ debugging release visual-studio-2010

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);
}
Run Code Online (Sandbox Code Playgroud)

我得到了上面的代码,调试和发布模式有一个奇妙的区别.该算法旨在使向量的第一个元素等于零,然后找出第一个元素与其他元素的对数差异.

在调试模式下,这给出了我想要的结果,并且向量的第一个元素总是等于零.但是当我切换到释放模式时,向量的第一个元素等于一些小数字,例如8.86335e-019.

而这还不是全部.当我把行"cout << price << endl;" 在行"price = log(price);"之后 然后我从发布版本获得的结果与调试模式中的结果相同.有什么解释吗?

tot*_*two 6

调试浮点堆栈使用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设置为完全精度.