我理解是这样的:在C双精度减去2个double
数字时++它们首先转化为开始与一个次2到幂的一个有效数。那么如果相减的数字在有效数字中具有相同的指数和许多相同的数字,则可以得到错误,从而导致精度的损失。为了测试这个对我的代码,我写了下面的安全增加功能:C++浮点减法误差和绝对值
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:The函数报告错误,我得到了非常不正确的值9.9475983006414e-14
2)98989898989898-98989898989897:函数报告错误,但我得到正确的值1
显然我误解的东西。有任何想法吗?
如果您希望获得的不仅是一个近似结果,而且是一个浮点计算错误的界限,您可以使用区间算术,向下舍入为下限,向上舍入为上限。必须有C++包才能做到这一点。 – 2013-04-29 20:40:02