可以将双倍溢出到负值吗?

时间:2013-02-19 15:45:33

标签: c++ double ieee-754 underflow boost-ublas

您好我正在使用g ++编译器并且遇到(我认为)是双打下溢,这是否可能,如果是这样,行为是如何定义的

我已在此处上传了协方差矩阵(51x51)的csv格式:http://pastebin.com/r0fx1qsx

这是代码(在c ++中需要提升)我用来计算行列式(我已经切换到long double并且没有效果):

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

如你所见,一个是(略)正,而一个是(略)否定

1 个答案:

答案 0 :(得分:4)

假设浮点单元正常运行,它不会溢出到负值 - 如果该值超出有效范围,结果将为“+ INF”(正无穷大)。这只能发生在有符号整数上。

当然,完全有可能在计算中出现各种错误,当预期为正时,会给出否定答案。