2017-09-14 3 views
3

Ich habe die Phänomene festgestellt, dass mein Code mir verschiedene Ergebnisse gibt, wenn ich Debug-Modus oder Release-Modus verwende. Ich habe das Problem auf den unten stehenden Code reduziert. Ich bin mit Microsoft Visual Studio Professional 2013 und der libeary boost 1,62Warum gibt die numerische Boost-Bibliothek beim Debuggen oder Freigeben unterschiedliche Ergebnisse?

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

Das Ergebnis, während im Debug-Modus 1. # QNAN ist 1. # QNAN

Das Ergebnis, während im Release-Modus 0 0

ist

Ich würde gerne wissen, was dieses Problem verursacht und wie man das beheben kann. Da dies in meinem Projekt zu gravierenden Problemen führt, kann ich mich nicht auf die Ergebnisse verlassen.

Antwort

3

sqrt einer negativen Zahl ist ein schwieriger Vorschlag. Das Problem ist Interval(-2, -2). Es bleibt die Magie von VisualStudio, 0, 0 zu produzieren. :). nan ist die am besten geeignete Antwort auf sqrt(-x). Sie können sqrt von std::complex<T>.

+0

Das Problem von 'std :: complex ' ist, dass ich Intervall der Boost-Bibliothek verwenden muss. Laut Dokumentation ist dies nicht möglich. Hier sind die Anführungszeichen: 'Erstens, wegen der Definition eines Intervalls müssen die Basiszahlen vollständig geordnet sein, so dass zum Beispiel komplex nicht als Basistyp für Intervalle verwendbar ist. (...)' Allowed all Dies kann dazu führen, dass das Vorlagenargument T des Klassenvorlagenintervalls auf die Gleitkommatypen float, double und long double gemäß Definition im IEEE-754-Standard beschränkt werden soll – solid

Verwandte Themen