天天看點

《數值分析(原書第2版)》—— 0.4 有效數字缺失

本節書摘來自華章出版社《數值分析(原書第2版)》一 書中的第0章,第0.4節,作者:(美)timothy sauer,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

了解計算機算術的細節的好處在于我們在一個相對好的位置上了解計算機計算中可能出現的陷阱.有一個主要問題以多種形式出現,該問題是由于對近似相等的兩個數字相減造成有效數字的位數減少.在這個問題的最簡單形式裡,這是一個清晰的描述.假設經過大量的努力,作為長計算中的一個部分,我們已經确定兩個具有7位有效數位的數,現在需要對它們進行相減:-123.4567123.4566000.0001這個相減問題在開始的時候,有兩個具有7位有效數位的數字,但是得到的結果卻僅僅隻有一位有效數位的精度.盡管這個問題十分容易了解,但是其他造成有效數位缺失的例子就更微妙了,在很多情況下可以通過重新構造計算來避免這個問題.

例0.5 在三位小數的計算機上計算9.01-3.

這個例子依然簡單,在這裡僅僅作為示例.我們沒有像在雙精度ieee标準格式中那樣使用具有52位尾數的計算機,而是假設使用隻有三位小數的計算機.使用三位計算機意味着整個過程中每個中間計算儲存的浮點數隻有三位尾數.問題中資料(9.01和3.00)都給定具有三位精度.由于我們将使用三位計算機,樂觀的情況下,我們希望結果中也包含三位有效數字.(很顯然,由于在整個計算中我們隻使用三位數字,是以不能指望得到的有效數字比3位還多.)用手持電腦檢查一下,我們發現正确的結果近似是0.0016662=1.6662×10-3,使用三位計算機我們能得到多少位的正确數字?

事實表明,一個有效數位都沒有得到.由于9.01≈3.0016662,當我們使用三位有效數字儲存中間結果的時候得到3.00.再減去3.00,我們得到的最終結果是0.00.我們的結果中沒有一個有效數位是正确的.

令人驚訝的是,有一種方式即便是在這樣的三位計算機上,也可以挽救這個計算.造成有效數字丢失的原因是我們顯式地減去兩個近似相等的數字9.01和3.可以用代數重寫表達式,以避免該問題.9.01-3=(9.01-3)(9.01+3)9.01+3=9.01-329.01+3

=0.013.00+3=0.016=0.00167≈1.67×10-3這裡,由于下一個數位是6,我們通過向上進位把尾數的最後一位變為7.使用這種方式我們得到所有的三位正确的數位,至少是通過舍入得到正确的三個數位.16通過這個例子我們知道在計算中需要盡可能避免把兩個近似相等的數字相減.

在前面例子中使用的方法本質上講是一個小竅門.通過“共轭等式”進行相乘是一個進行計算重構的竅門.通常會使用一些特定的恒等式,例如三角等式.例如,當x接近0時計算1-cosx就可能會造成有效數字的缺失.讓我們比較如下式子對于一組輸入數字x進行的計算e1=1-cosxsin2x和e2=11+cosx我們通過對e1的分子和分母同時乘上1+cosx,然後使用三角等式sin2x+cos2x=1.在無窮精度中,兩種計算等價.但是matlab計算中的雙精度數字時我們得到了如下的表:

xe1e21.000000000000000.649223205204760.649223205204760.100000000000000.501252086288580.501252086288570.010000000000000.500012500208480.500012500208340.001000000000000.500000124992190.500000125000020.000100000000000.499999998627930.500000001250000.000010000000000.500000041386850.500000000012500.000001000000000.500044450291340.500000000000130.000000100000000.499600361081320.500000000000000.000000010000000.000000000000000.500000000000000.000000001000000.000000000000000.500000000000000.000000000100000.000000000000000.500000000000000.000000000010000.000000000000000.500000000000000.000000000001000.000000000000000.50000000000000

右邊的一列e2中所有顯示的數字都是準确的.在e1計算中,由于兩個近似相等的數字相減,在x=10-5以下出現了明顯的問題,對于輸入數字x=10-8或者更小的數字沒有得到任何有效數字.

e1式子對于x=10-4已經有幾個不正确的位,當x下降,這個問題變得更糟.等價的式子e2不需要對近似相等的數字相減,就沒有這樣的問題.

二次方程通常面臨有效數字缺失的問題.隻要知道存在有效數字缺失的問題,同時知道如何重建等式就可以避免這個問題.

例0.6 找到二次等式x2+912x=3的兩個根.

首先在雙精度算術中試圖求解這個問題,例如,使用matlab.兩個根都沒有得到正确的結果,除非我們知道有效數位缺失問題的存在,并知道如何避免這個問題.問題是要找到具有4位有效數位精度的根.目前看起來這是個簡單問題.形如ax2+bx+c=0的二次方程的根用如下的二次等式的形式給出:x=-b±b2-4ac2a(0.12)對于我們的問題,轉化為x=-912±924+4(3)217使用負号得到根x1=-2.824×1011具有正确的4位有效數字.對于正号的根x2=-912+924+4(3)2matlab計算得到0.盡管正确的結果和0非常接近,但是結果中沒有得到一個正确的有效數位,盡管用于定義問題的數字是精确的(具有無窮多正确的數位),盡管matlab以近似16位有效數字進行計算(這解釋了matlab的機器精度是2-52≈2.2×10-16).我們該如何解釋不能得到x2的精确數位?

答案是有效數字的缺失.很顯然,相對來講,912和924+4(3)近似相等.更精确地,作為儲存的浮點數字它們的尾數不僅開始部分相似,而且是完全相同的.當它們相減時,如二次公式所示,很顯然結果是0.

這種計算能避免嗎?我們必須修複有效數字缺失的問題.計算x2的正确方式是重構二次公式:x2=-b+b2-4ac2a=(-b+b2-4ac)(b+b2-4ac)2a(b+b2-4ac)

=-4ac2a(b+b2-4ac)=-2c(b+b2-4ac)在我們的例子中使用matlab代入a,b,c,得到x2=1.062×10-11,這個結果具有題目所需的4位有效數字的精度.

這個例子告訴我們,當a與/或c相對于b非常小的時候,二次公式(0.12)必須小心使用.更準确地說,若4acb2,則b和b2-4ac在量級上相等,其中的一個根就會面臨有效數位丢失的問題.如果b在這種情況下是整數,則根必須以如下方式進行計算:x1=-b+b2-4ac2a與x2=-2c(b+b2-4ac)(0.13)注意到,兩個公式都沒有近似數相減的問題.另一方面,如果b是負數,4acb2,則兩個根最好進行如下形式的計算:x1=-b+b2-4ac2a與x2=2c(-b+b2-4ac)(0.14)180.4節習題

1.指明對于什麼值的x存在兩個近似數相減的問題,并找到另外一種形式避免該問題.

(a) 1-secxtan2x(b) 1-(1-x)3x(c) 11+x-11-x

2.計算方程x2+3x-8-14=0的根,保留三位精度.

3.解釋如何盡可能精确地計算方程x2+bx-10-12=0的兩個根,其中b是一個比100大的數.

4.證明公式(0.14).

0.4節程式設計問題

1.利用雙精度算術(例如使用matlab)計算如下式子,其中x=10-1,…,10-14.然後,使用另外一種形式的式子,避免兩個近似相等的數字相減的問題,重複這個計算,然後對結果制表.報告對于每個x在原始表達中正确數位的個數.

(a) 1-secxtan2x(b) 1-(1-x)3x

2.尋找p的最小值,使得雙精度計算x=10-p中沒有正确的有效數位.(提示:首先确定表達式的極限x→0.)

(a) tanx-xx3(b) ex+cosx-sinx-2x3

3.以4位正确的有效數字計算a+a2+b2的值,其中a=-12345678987654321,b=123.

4.以4位正确的有效數字計算c2+d-c的值,其中c=246886422468,d=13579.

5.考慮一個直角三角形,兩條直角邊長度是3344556600和1.2222222.斜邊比最長的直角邊長多少?給出至少具有4位正确數位的結果.