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

发布于 2024-11-16 21:41:14 字数 641 浏览 3 评论 0原文

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);
}

我得到了上面的代码,调试和发布模式有一个神奇的差异。该算法的目的是使向量的第一个元素等于0,然后求第一个元素与其他元素的对数之差。

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

这还不是全部。当我输入“cout <<价格<< endl;”行时在“price=log(price);”行之后然后我从发布版本得到的结果与调试模式得到的结果相同。有什么解释吗?

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);
}

I got the code above and there is a miracalous difference in debug and release modes. The algorithm aims to make the first element of the vector equal to zero and then finds the differences of the logarithms of the first element with other elements.

In debug mode, this gives the result that I desire and the first element of the vector is always equal to zero. But when I switch to the release mode the first element of the vector is equal to some small number such as 8.86335e-019.

And that's not all. When I put the line "cout << price << endl;" after the line "price=log(price);" then the result I got from the release version is same with the one from the debug mode. Any explanations?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

莫多说 2024-11-23 21:41:14

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

使用 /fp 修改浮点行为,使其独立于构建http://msdn.microsoft.com/en-us/library/e7s85ffb%28VS.80%29.aspx 请参阅http://thetweaker.wordpress.com/2009/08/28/debugrelease- numeric-differences/ 以及

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

The debug floating point stack uses full 80-bit precision available in the FPU. Release modes perform on more efficient 64-bit truncated results.

Modify your floating-point behavior to be build independent with /fp http://msdn.microsoft.com/en-us/library/e7s85ffb%28VS.80%29.aspx See http://thetweaker.wordpress.com/2009/08/28/debugrelease-numerical-differences/ as well

Some of the differences you are observing are simply to do with display precision. Make sure to set cout to be full precision before you compare it to the value displayed by the MSVC debugger.

浪推晚风 2024-11-23 21:41:14

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

Try turning off optimizations in your release build...

西瑶 2024-11-23 21:41:14

当您使用浮点计算时,8e-19 量级的误差接近于零。

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

When you use floating point calculations, an error on the order of 8e-19 is as close to zero as you get.

You have an error that is less than a billionth of a billionth of the calculated value. That's pretty close!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文