3

こんにちは私はg++コンパイラを使用していて、(私が思うに)doublesのアンダーフローを経験しています。これは可能ですか?もしそうなら、動作はどのように定義されますか

共分散行列(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つは(わずかに)ポジティブですが、もう1つは(わずかに)ネガティブです

4

1 に答える 1

4

浮動小数点ユニットが正しく動作していると仮定すると、負の値にオーバーフローすることはありません。値が有効な範囲外の場合、結果は「+ INF」(正の無限大)になります。これは、符号付き整数でのみ発生する可能性があります。

もちろん、正の答えが期待されるときに負の答えを与える計算でさまざまなエラーが発生する可能性は完全にあります。

于 2013-02-19T15:51:42.437 に答える