程式的誤差問題
計算機運算過程出現誤差,是一件很正常的事,輕微的誤差除了令到答案出現準確度不足的問題,更可能令到程式出現錯誤(ERROR),甚至所得的答案完全錯誤,例如:二次方程的判別式若果正確的數值為零,但卻得出一個很細小的負數,就有可能令到計數機的程式誤以為無實數解等等。所在編寫程式一定要小心誤差可能帶來的問題,減少出錯的機會。
1. 了解函數的特點:
不同的數學函數有不同的特點,例如: f(x)=tan X,當X較接近90o時X些微的改變,函數 tan X就有巨大的改變,誤差亦可能會大大增加等等。
2. 誤差累積擴大的特性:
當經過很多運算(複雜的函數運算),誤差有可能會累積並且增大。
3. 加減運算的誤差問題:
這個誤差的問題,很多人都會忽略,其實加減數所造成的誤差很多時都比乘除數及複雜的函數運算還要大,看看以下例子了解誤差形成的原因。
算式1: 1000 ÷ 3 - 1 ÷ 3 - 333
算式2: 1000 ÷ 3 - 333 - 1 ÷ 3
算式1及算式2在數學上的意義是相同,但在計數機上執行,結果就不同,前者為0,後者為 -3.33x10-13。原因在於計數機儲存數值的方法,1000 ÷ 3 產生333.333333333333 (共15位數值),當減去333後,只餘下0.333333333333 (12位數值),所以再減 1 ÷ 3 (0.333333333333333,15位數值)就出現誤差了。現在再考慮算式1,1000 ÷ 3產生333.333333333333 (共15位數值),先減 1 ÷ 3 (15位數值),由於1/3的數值比1000/3的數值小,運算時1/3最後的兩個數值會被忽略,所以先產生333的結果,當再減333,就會變成零,所以計算的先後次序不同就有不同的結果。
4. 計數機自動修正功能:
先看以下算式:
1 ÷ 3 + 1÷ 3 + 1 ÷ 3
答案很明顯為1,但實際上計數機將三個15位的 0.333333333333333相加,答案應該為15位的0.999999999999999,但最後答案卻變為1,這就是計數機的自動修正功能。所以如果你計算下列式:
1 ÷ 3 + 1÷ 3 + 1 ÷ 3 + 1 ÷ 3 + 1÷ 3 ............
由於過程中會產生整數(自動修正),所以即使加很多次誤差不會增加,不過某些情況(例如無理數)計數機的自動修正功能會失效,例如: 計算過程不能產生整數部份,看看以下的算式:
1 ÷ 7 + 1 ÷ 3 + 1 ÷ 3 + 1÷ 3 + 1 ÷ 3 + 1 ÷ 3 + ........
由於計算過程不能產生整數,自動修正功能將會失效,不斷加 1/3 誤差就會增加。