【发布时间】:2011-09-19 19:57:58
【问题描述】:
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
【问题讨论】:
-
请注意:使用
++iter2对抗iter2++。iter2++源代码通常看起来像这样:iterator operator++ (int i) { iterator temp = (*this); ++(*this); return temp; }; -
通过最荒谬的修改解决了问题。我添加了“价格 -= 0;”在“price=log(price);”行之后
-
这正是我所说的复杂和变化无常的意思。该行虽然看似无害,但可能会将
price推出更高精度的内部存储器,从而在您接下来访问它时导致值略有不同。你不能依赖它总是有效的......一组不同的优化设置,或者附近的另一个无害的变化,可以让你回到你开始的地方。如果您需要第一个元素完全为零,则将其设置为零。无论哪种方式,始终依靠浮点错误。
标签: c++ visual-studio-2010 debugging release