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);”之后然后我从发布版本获得的结果与调试模式中的结果相同。有什么解释吗?
答案 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数量级的错误就像你得到的那样接近于零。
您的错误小于计算值的十亿分之一十亿分之一。那非常接近!