Привет, я использую компилятор g ++, и я испытываю (что я думаю) недополнение двойников, это возможно, и если да, то как определяется поведение
Я загрузил формат CSV ковариационной матрицы (51×51) здесь: http://pastebin.com/r0fx1qsx
Это код (в C ++ требует повышения), который я использую для вычисления определителя (с тех пор я переключился на длинные двойные и не оказал эффекта):
int determinant_sign(const boost::numeric::ublas::permutation_matrix<std ::size_t>& pm)
{
int pm_sign=1;
std::size_t size = pm.size();
for (std::size_t i = 0; i < size; ++i)
if (i != pm(i))
pm_sign *= -1.0; // swap_rows would swap a pair of rows here, so we change sign
return pm_sign;
}
long double determinant( boost::numeric::ublas::matrix<long double>& m ) {
boost::numeric::ublas::permutation_matrix<std ::size_t> pm(m.size1());
long double det = 1.0;
if( boost::numeric::ublas::lu_factorize(m,pm) ) {
det = 0.0;
} else {
for(int i = 0; i < (int)m.size1(); i++)
det *= m(i,i); // multiply by elements on diagonal
det = det * determinant_sign( pm );
}
return det;
}
Результат, который мне дают для данных: -3.59916e-183
,
Когда я запускаю следующее matlab
код:
M = csvread('path/to/csv');
det(M)
the result I get is:
4.2014e-173
Как вы можете видеть, один (немного) положительный, тогда как один (немного) отрицательный
Если предположить, что модуль с плавающей запятой работает правильно, он не переполнится до отрицательных значений — результатом будет «+ INF» (положительная бесконечность), если значение выходит за допустимый диапазон. Это может произойти только с целыми числами со знаком.
Конечно, вполне возможно иметь различные ошибки в вычислениях, которые дают отрицательный ответ, когда ожидается положительный.
Других решений пока нет …