为什么boost数字库通过使用调试或发布模式给出不同的结果?

问题描述:

我遇到过这样的现象,当我使用调试模式或释放模式时,我的代码给了我不同的结果。我已将问题简化为下面的代码。我使用Microsoft Visual Studio 2013专业版和libeary提升1.62为什么boost数字库通过使用调试或发布模式给出不同的结果?

#include "stdafx.h" 
#include <iostream> 
#include <math.h> 

#include <boost/numeric/interval.hpp> 
#include <boost/numeric/interval/rounded_arith.hpp> 

using namespace std; 
using namespace boost::numeric::interval_lib; 
using namespace boost::numeric; 

typedef interval<double, policies<save_state<rounded_transc_std<double> >, 
checking_base<double> > > Interval; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    Interval result = (Interval(3.15, 4.6) - Interval(-0.6, 2.1))*sqrt(Interval(2, 2) + Interval(-2, -2)*Interval(10.022631612535406, 10.031726559552226)); 
    cout << "result: " << result.lower() << " " << result.upper(); 

    return 0; 
} 

的结果,而在调试模式下为1#QNAN 1#QNAN

结果,而在释放模式是0 0

我想知道是什么原因导致此问题以及如何解决此问题。因为如果我不能依赖结果,这会在我的项目中造成严重的问题。

sqrt负数是一个艰难的命题。问题是Interval(-2, -2)。它仍然是VisualStudio产生0,0的魔力。 nan是对sqrt(-x)最合适的答案。你可能sqrtstd::complex<T>

+0

'std :: complex '的问题是我需要使用boost库的间隔。根据文件,这是不可能的。这里是引号:'首先,由于区间的定义,基数必须是完全有序的,例如,复杂的不能用作区间的基数类型。'(...)'给定所有这可能需要将类模板间隔的模板参数T限制为由IEEE-754标准定义的浮点类型float,double和long double。 – solid