我理解是這樣的:在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