3

私が理解している方法は次のとおりですdouble。C ++で2つの数値を倍精度で減算すると、最初に2の指数乗から始まる仮数に変換されます。次に、減算された数値の指数が同じで、仮数に同じ桁が多数ある場合、エラーが発生する可能性があり、精度が失われます。私のコードでこれをテストするために、次の安全な追加関数を作成しました。

double Sadd(double d1, double d2, int& report, double prec) {
    int exp1, exp2;
    double man1=frexp(d1, &exp1), man2=frexp(d2, &exp2);
    if(d1*d2<0) {
        if(exp1==exp2) {
            if(abs(man1+man2)<prec) {
                cout << "Floating point error" << endl;
                report=0;
            }
        }
    }
    return d1+d2;
}

ただし、これをテストすると、奇妙なことに気づきます。実際のエラー (関数がエラーを報告するかどうかではなく、計算の結果として生じる実際のエラー) は、等しい桁数だけでなく、減算された数値の絶対値に依存しているようです。仮数で...

たとえば1e-11、精度として使用しprec、次の数値を減算します。

1) 9.8989898989898-9.8989898989897: 関数はエラーを報告し、非常に不正確な値 9.9475983006414e-14 を取得します

2) 98989898989898-98989898989897: 関数はエラーを報告しますが、正しい値 1 を取得します

明らかに私は何かを誤解しています。何か案は?

4

3 に答える 3