Я столкнулся с явлением, что мой код дает мне разные результаты, когда я использую режим отладки или режим выпуска. Я сократил проблему до кода ниже. Я использую Microsoft Visual Studio Professional 2013 и libeary boost 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;
}
Результат в режиме отладки: 1. # QNAN 1. # QNAN
Результат в режиме релиза 0 0
Я хотел бы знать, что вызывает эту проблему и как это исправить. Поскольку это вызывает серьезные проблемы в моем проекте, если я не могу положиться на результаты.
sqrt
отрицательного числа является жестким предложением. Проблема в Interval(-2, -2)
, Волшебство VisualStudio остается для получения 0, 0. :). nan
является наиболее подходящим ответом на sqrt(-x)
, ты можешь sqrt
из std::complex<T>
,
Других решений пока нет …