2017-09-14 1 views
3

J'ai rencontré le phénomène que mon code me donne des résultats différents lorsque j'utilise le mode de débogage ou le mode de libération. J'ai dépouillé le problème au code ci-dessous. J'utilise Microsoft Visual Studio Professional 2013 et le coup de pouce libeary 1,62Pourquoi la bibliothèque numérique boost donne-t-elle des résultats différents en utilisant le mode debug ou release?

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

Le résultat en mode debug est 1. # QNAN 1. # QNAN

Le résultat en mode sortie est 0 0

Je voudrais savoir ce qui cause ce problème et comment y remédier. Cela cause de sérieux problèmes dans mon projet si je ne peux pas compter sur les résultats.

Répondre

3

sqrt d'un nombre négatif est une proposition difficile. Le problème est Interval(-2, -2). Reste la magie de VisualStudio à produire 0, 0. :). nan est la réponse la plus appropriée à sqrt(-x). vous pouvez sqrt de std::complex<T>.

+0

Le problème de 'std :: complex ' est que j'ai besoin d'utiliser l'intervalle de la bibliothèque boost. Selon la documentation, ceci n'est pas possible. Voici les guillemets: Premièrement, en raison de la définition d'un intervalle, les nombres de base doivent être totalement ordonnés. Ainsi, par exemple, le complexe n'est pas utilisable comme type de base pour les intervalles. (...) 'Compte tenu de tout ceci, on peut vouloir limiter l'argument template T de l'intervalle du template de classe aux types virgule flottante float, double et long double, comme défini par la norme IEEE-754. – solid