2017-09-14 8 views
3

디버그 모드 나 릴리스 모드를 사용할 때 내 코드에서 다른 결과를 얻는 현상이 발생했습니다. 문제를 아래 코드에서 제거했습니다. 릴리스 모드 0 0왜 숫자 라이브러리는 디버그 또는 릴리스 모드를 사용하여 다른 결과를 제공합니까?

동안 디버그 모드에서 1. # QNAN

결과 1 # QNAN 동안 나는 마이크로 소프트 비주얼 스튜디오 프로페셔널 2013과 libeary 부스트 1.62

#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; 
} 

결과를 사용하고 있습니다

이 문제의 원인과 해결 방법을 알고 싶습니다. 결과에 의존 할 수 없다면 프로젝트에 심각한 문제가 생길 수 있습니다.

답변

3

sqrt은 거친 제안입니다. 문제는 Interval(-2, -2)입니다. 0, 0을 생성하는 것은 VisualStudio의 마법입니다. :). sqrt(-x)에 가장 적합한 대답은 nan입니다. sqrtstd::complex<T> 일 수 있습니다.

+0

'std :: complex '의 문제는 boost 라이브러리의 간격을 사용해야한다는 것입니다. 문서에 따르면 이것은 불가능합니다. '우선, 간격의 정의로 인해 기본 숫자가 완전히 정렬되어야합니다. 예를 들어, 복소수 은 간격의 기본 숫자 형식으로 사용할 수 없습니다.'(...)'모두 제공 클래스 템플릿 간격의 템플릿 인수 T를 IEEE-754 표준에 정의 된 부동 소수 유형 float, double 및 long double로 제한하려고 할 수 있습니다. – solid