我正在用Visual Studio 2008开发一个用C ++编写的程序。 最近我开始在发布模式下测试我的程序,我开始在一些计算的关系中得到一些奇怪的错误,它总是返回0而不是正确的值(在调试模式中正确计算)。
我做了一些研究,最后我确定了(至少我相信)问题是什么。如果我在释放模式下禁用优化标志(/ Od),程序在调试模式下的行为就像通常一样。但是,因为我真的需要这种优化的速度(至少使用O2标志),我开始测试很多东西,以便在保持良好执行时间的同时获得正确的结果。我将浮点模型设置为pf:strict选项,但仍然得到相同的错误(我的长双精度值仍为0)。
跟踪这个奇怪的行为我得到这个示例代码(在循环内)(需求是一个很长的双变量):
long double demand = 0;
vector<int> someArray = getSomeArray();
for (int i = 0; i < someArray.size(); i++) {
if (someCondition(someArray[i])) {
int someId = getSomeId(someArray[i]);
long double d = getSomeLongDouble(someArray[i]); <--- correctly setted!
demand = demand + d; <---- d=0.018182000000000000 demand = 0
someLogic(someId); <--- at this point, demand is still 0!!!!
}
}
无论如何,即使我插入一个断点并手动检查变量d的值是否为>时,需求总是为0。 0。 请,我真的需要优化标志给出的速度提升,但我不知道如何保持这个特定的计算正确...
任何帮助都将不胜感激:)请原谅我的英语!!