我理解它的方式是:double
在 C++ 中用双精度减去两个数字时,它们首先被转换为一个有效数字,从 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
显然我误解了一些东西。有任何想法吗?