警戒位
如果說一個許多步驟計算的最終結果可以安全地捨入到 N 位小數,那麼,最終的捨入操作引入的捨入誤差對整體不確定性的影響可以忽略不計。
然而,在中間步驟捨入到同樣多的位數很可能是不安全的。 因為捨入誤差可以累積。 如果中間步驟中用了 M 位小數,那麼就有 M−N 個警戒位。
在多數計算系統中,浮點運算都會用到警戒位。例如 我們必須對齊它們的位數。也就是說我們必須向第一個操作數額外添加一位,即警戒位。 因此我們有 ,計算可得 或 . 如果不用警戒位的話,就是 ,計算得到 或 。產生了100%的相對誤差。由此可見警戒位的重要性。
以下一段 C 代碼說明了一個由浮點捨入導致的錯誤:
int main(){
double a;
int i;
a = 0.2;
a += 0.1;
a -= 0.3;
for(i = 0; a < 1.0; i++)
a += a;
printf("i=%d, a=%f\n", i, a);
return 0;
}
看上去程序不會終止。 然而輸出是 :
i=54, a=1.000000
另一個例子是:
給定2個數字: 和 。我們使第一個數字中 的冪次和第二個數字一致,即:。那麼兩個數字的加和是:
0.0256*10^2 2.3400*10^2 + ____________ 2.3656*10^2
第二個數( )在填充兩個 之後,後面的位數即警戒位,再後面的是捨入位。 捨入之後的結果是 而非 ,如果沒有多餘的位(警戒位和捨入位)的話,即僅考慮 。誤差是 。
參考文獻
- Forman S. Acton. Numerical Methods that Work, The Mathematical Association of America (August 1997).
- Higham, Nicholas J. Accuracy and Stability of Numerical Algorithms, Washington D.C.: Society for Industrial & Applied Mathematics, 2002.