實數化約成浮點數的規則

書上寫的化約規則是簡化的情況,對大部分讀者, 那樣的了解應該足夠解釋一般計算所遇到的狀況。 有興趣知道更多細節的讀者,可以看看這一篇擴編教材。

書本中描述的四種精度之浮點數,其實都是 IEEE (Institute of Electrical and Electronics Engineers, 美國的電機與電子工程師協會) 建議的標準規格, 那份建議文件稱為 IEEE 754-1985。 其中單精度與雙精度浮點數標準已經頗為廣泛, 內建在大多數個人電腦或工作站的 CPU 裡面。 我們可以說,現在讀者會用到的電腦,都支援這兩種精度的浮點數。 但是兩種超精度浮點數就不一定了。 Intel 的 Pentium 系列 CPU 支援 80-bit 的超精度浮點數 F10, 而 Sun 的 64 位元 Ultra-Sparc CPU,以及 HP, DEC (已經被 HP 併購) 和 IBM 的 64 位元 CPU,都支援 128-bit 的超精度浮點數 F16

在書本中,只詳細說明了雙精度浮點數 F8 的規格標準, 並沒有詳細介紹其他三種 IEEE 浮點數標準; 但是,書中列出來其他三種標準的規格數據,主要就是

讀者可以將這些數據套用在關於 F8 的描述上面, 而獲得關於另外那三種浮點數的相關數據,包括

這裡要補充書本中沒有詳細說明的兩個細節。

Inf 和 NaN

如果指數部份全是 1,而底數部份全是 0,則代表 Inf。 至於是 +Inf 還是 -Inf,則由 MSB 決定。 如果指數部份全是 1,而底數部份只要有任何一個位元是 1, 就代表 NaN。NaN 沒有正負之分。

浮點數的除法計算,當分子不是 0 而分母是 0 (有可能因為遜位而變成 0),則得到 Inf 結果。 而 Inf 的正負號,則由分子、分母的符號決定 (如果是由於遜位造成的 0,可能是 +0 或 -0)。 而浮點數的加、減、乘法計算,都可能造成溢位而產生 +Inf 或 -Inf。

微積分教科書裡面,通常會列出來一些極限問題的「不定型式」 (indeterminate forms),也就是可以應用「羅必達法則」的型式。 凡是遇上這種不定型式的計算,就會出現 NaN。包括

數學中還有關於次方運算的不定型式,但是浮點數計算電路並沒有次方運算, 所以沒有對應的 NaN 規定。

化約規則

x 是一個正實數, 則所謂的「化約」就是挑選一個浮點數 (包括 +Inf ,-Inf, NaN 或 0) 來取代 x,記做 fl(x)。 這個實數 x 可能是以 ASCII 數目字輸入的,例如
3.141592653589793238462643
或者是兩個浮點數在 CPU 電路中的加減乘除計算結果。 不論是哪種情況,都要先「化約」,然後才能儲存到電腦記憶體內。

如果是遜位或溢位,則如書本上所寫。 如果不會遜位也不會溢位,則有兩種情況:

  1. x 本身恰好就是浮點數,那當然就令 fl(x) = x
  2. 否則 x 必然落在兩個相鄰的浮點數之間,假設
    L < x < R
    而 L, R 是兩個相鄰的浮點數 (也就是說 L < R 而 L 和 R 之間沒有其他浮點數)
在第二種情況下, IEEE 754-1985 建議了四種化約的規則, CPU 設計師可以按照任何一種規則來設計電路,都算是符合 IEEE 浮點數標準。 這四種方法是:

依照 CPU 的「化約」方式之不同,會影響 x 和 fl(x) 之『相對誤差』,而所謂『機器精度』的值也會有所改變。

事實上,現在市場上高級一點的 CPU, 例如 Intel 的 Pentium 系列和 Sun 的 Sparc 系列, 都採用「取近數」的化約方式。 至於怎樣得知所使用之 CPU 採用哪種化約方式, 除了閱讀硬體手冊之外,還可以使用程式語言來測試。 最方便的測試軟體之一,是 Matlab。 如果讀者能夠操作 Matlab,可以去第B講閱讀 Matlab 線上教材【發展篇】 看《利用 Matlab 認識 IEEE 浮點數標準》那一節,和它的前後幾節。

課外讀物:
[1] IEEE 754-1985 修訂工作小組網頁 http://grouper.ieee.org/groups/754
[2] Sun (昇陽) 公司 Sparc 硬體說明手冊,第二章 "IEEE Arithmetic" http://docs.sun.com/source/806-3568/ncg_math.html

[ 發表感想或意見 ] ‧ [ 讀者推薦課外讀物 ]

BCC16 Home Up Chap 0 Chap 1 Chap 2 Chap 3 Chap 4 Chap 5 Chap 6 Chap 7 Chap 8 Chap 9 Chap A Chap B Chap C Chap D Chap E Chap F Copyright Pool User
製作人、
修改記錄
單維彰 (2004/05/21) ---