數值線性代數

浮點運算

在紙上,一個實數可以有無窮多位數字。電腦無法儲存這些,所以它只保留固定位數的有效數字加上一個指數——就像二進位下的科學記數法。其結果就是浮點數:每個數都被捨入到最近的可表示值,相鄰可表示數之間存在間隙。這正是為什麼計算出來的線性代數永遠與精確的線性代數不完全相同。

關鍵常數是機器精度,常記作 eps 或 u,即 1 與下一個可表示數之間的間隙(對 IEEE 雙精度,eps 約為 2.2e-16,相當於約 16 位十進位有效數字)。每個基本運算都滿足 fl(a op b) = (a op b)(1 + delta),其中 |delta| <= u:單個加法、乘法或除法都幾乎達到滿精度的相對準確度,但這些微小誤差會在整個演算法中累積。

有兩個後果影響著一切。其一,浮點加法不滿足結合律——(a + b) + c 可能不等於 a + (b + c)——所以運算次序很重要。其二,兩個幾乎相等的數相減會引發災難性抵消:前導數字相同並相互抵消,把原先隱藏的捨入雜訊暴露成答案的前導數字。

實用的教訓是要謙遜。計算出的答案 x-hat 並非精確答案 x;二者之差取決於你做了多少次運算、它們如何排列,以及問題本身有多敏感(即其條件數)。好的數值演算法都經過設計,使這種不可避免的捨入造成的損害盡可能小。

fl(a op b) = (a op b)(1 + delta), |delta| <= u, u ~ 1.1e-16 (double)

浮點運算的標準模型:每次運算都精確到一個微小的相對擾動以內,該擾動以單位捨入誤差 u 為界。

機器精度關乎的是表示方式,而非誤差最終有多大。即便每一步都精確到 eps 以內,單個演算法仍可能損失許多位數字——這些損失來自抵消和病態問題,而非某一次捨入。

又稱
machine arithmeticIEEE 754 arithmetic