C++;长双打和优化标志的奇怪行为 我正在用Visual Studio 2008开发C++程序。 最近,我开始在发布模式下测试我的程序,我开始得到一些与某些计算相关的奇怪错误,这些错误总是返回0而不是正确的值(在调试模式下正确计算)

C++;长双打和优化标志的奇怪行为 我正在用Visual Studio 2008开发C++程序。 最近,我开始在发布模式下测试我的程序,我开始得到一些与某些计算相关的奇怪错误,这些错误总是返回0而不是正确的值(在调试模式下正确计算),c++,visual-studio-2008,optimization,floating-point,C++,Visual Studio 2008,Optimization,Floating Point,我做了一些研究,最后我确定(或者至少我相信)问题是什么。如果在发布模式下禁用优化标志(/Od),则程序在调试模式下的行为与平常一样。但是,因为我真的需要这种优化的速度(至少在O2标志下),我开始测试很多东西,以获得正确的结果,同时保持良好的执行时间。我将浮点模型设置为pf:strict选项,但仍然得到相同的错误(我的长双精度值仍然是0) 跟踪这种奇怪的行为,我得到了这个示例代码(在一个循环中)(需求是一个长的双变量): 长双需求=0; vector someArray=getSomeArray(

我做了一些研究,最后我确定(或者至少我相信)问题是什么。如果在发布模式下禁用优化标志(/Od),则程序在调试模式下的行为与平常一样。但是,因为我真的需要这种优化的速度(至少在O2标志下),我开始测试很多东西,以获得正确的结果,同时保持良好的执行时间。我将浮点模型设置为pf:strict选项,但仍然得到相同的错误(我的长双精度值仍然是0)

跟踪这种奇怪的行为,我得到了这个示例代码(在一个循环中)(需求是一个长的双变量):

长双需求=0;
vector someArray=getSomeArray();
for(int i=0;i长双d=getSomeLongDouble(someArray[i]);调试模式和发布模式之间的一个常见问题发生在变量未正确初始化的情况下。您确定在使用它之前已初始化
demand
吗?这似乎是一个无需思考的问题。您在这里的代码初始化了一个从未使用过的id,最后链接了一个从未声明过的变量的加法赋值调用一个未发布的函数。据我们所知,
demand
是一个
int
,给出了该赋值行右侧的注释。请发布真实的、可编译的代码,以再现您的问题。我已经编辑了我的问题。我真的不能更具体,因为逻辑太复杂,太大,无法在这里得到它。但请不要这样做ss我认为函数逻辑不会添加任何有用的东西,因为它们行为正确并返回正确的结果…只是添加和赋值不起作用(需求不会得到d值的增加)。
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!!!!
    }

}