私が理解している方法は次のとおりです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 を取得します
明らかに私は何かを誤解しています。何か案は?