基礎:演算法、近似與誤差

有效位數

有效位數是一個數中真正攜帶有意義、可信任資訊的那些位數——從第一個非零數字往後算起。在 0.004520 中,有效位數是 4、5、2 和末尾的 0(共四位);前導的零只標示小數位置,不算在內。它是一種非正式但實用的方式,用來說一個量被知道得有多精確。

在計算中,有效位數其實是關於相對誤差的陳述。說近似 x~ 與真值 x 一致到 d 位有效數字,大致意味著 |x~ - x| / |x| 約為 5 乘以 10^(-(d+1)),或簡單說相對誤差約為 10^(-d)。所以 d 位正確的有效數字與 10^(-d) 的相對誤差,是同一件事的兩種說法。雙精度浮點約攜帶 15 到 16 位有效十進位數,因為它的相對精度(單位捨入)約為 1.1e-16——這就是任何雙精度結果能被信任的位數上限。

有效位數重要,因為它告訴你何時該停止相信一份輸出。一個印出 3.14159265358979 的計算,也許只有前 6 位是正確的;其餘是累積誤差的雜訊。有兩個效應會悄悄摧毀有效位數:災難性抵消——相減兩個幾乎相等的數會抹去前導位數,把捨入雜訊提拔進結果;以及病態——條件數約 10^8 的問題,在任何演算法開始之前就已損失你 16 位中的約 8 位。印出比你掙得的更多位數,是一個安靜卻常見的謊言。

對 x = 0.0001 直接計算 1 - cos(x):cos(x) 捨入為 0.99999999...,相減抵消了前導位數,結果只保留真值 5.0e-9 的少數幾位有效數字——改寫為 2 sin^2(x/2) 可把它們救回。

幾乎相等的數之間的抵消,悄悄摧毀了有效位數。

印出 16 位不代表有 16 位正確。雙精度把你封在 16 位附近,但抵消與病態可能只留下少數幾位可信——多出的位數純粹是捨入雜訊。

又称
significant figuressig figs有效數字