2014-06-21

Floating Point Standard

目前工程運算上的浮點數標準由IEEE 754-1985定義,
接下來要介紹此定義下的single precision(32-bit)、與double precision(64-bit),
以及相關的運算。












十進位的科學記號表示法為例如:-5.43×1021
而二進位的科學記號表示法為例如:1.23×245
IEEE 754使用二進位的科學記號表示法,其中1.23稱為significand。

IEE 754把一個浮點數分成如上圖的3個區塊:
(1) S: sign-bit (0代表負數,1代表正數)
(2) Normalized Significand: 1.0 ≦ |significand|< 2.0
(3) Fraction只存siginificand的小數部分,(即上例中1.23的fraction為23)
    因此還原時要把1加回來。
    由(2)的標準規範可知,significand都是1.xxx,
    因此沒必要去存開頭的那個1,只要存xxx就好。
(4) 我們在做浮點數運算時,必須確保兩數的Exponent一樣,
    但有正負號時會不好判斷誰的exponent比較大,
    因此會先把exp都轉成unsigned(原本的exp+Bias),還原時就要把Bias減回來。
    Bias => Single Precision: 127,  Double Precision: 1023
    (bias的詳細內容請見置底註1)


【single precision的極值】
(1) 最小值:significand為1.000...0,fraction都是0,
    exponent為最小的1,原本的exponent = 1-127 = -126
    因此答案為 ±1.0×2-126 ≈ ±1.2×10-38
(2) 最大值:significand為1.111...1,fraction都是1,(因此significand近似於2.0)
    exponent為最大的254,原本的exponent = 254-127 = 127
    因此答案為 ±2.0×2127 ≈ ±3.4×1038


【浮點數轉成IEEE 754格式】




















【IEEE 754格式轉成小數】


















【IEEE 754 Encoding Table】

















(1) 第一欄(綠):0
(2) 第二欄(藍):非正規的數字
(3) 第三欄(橙):正規的數字
(4) 第四欄(紅):無限大
(5) 第五欄(灰):沒有意義的數字

剛剛有提過,
single precision的最小非負值為1.0×2-126  (0_0...0_00000001),
而denormalized的最小非負值為1.0...1×2-127(0_0...1_00000000)。


【Floating-Point Addition】



















上圖是浮點數加法器,(點擊可放大)
基本的加法步驟為:
(1) 把兩個數的exponent align成一樣(小的exp轉換成大的exp)
(2) 把significand相加
(3) normalize,以及檢察是否有溢位情形
(4) 進位,以及再次normalize





















值得一提的是,
我們為何要把小的exp調整成大的exp,而不是反過來。

舉個例子:9.999×101+1.234×10-2
如果我們把exp調整成小的,就會變成:9999×10-2+1.234×10-2
而9999+1.234可能會有overflow的問題。
反之,若我們把exp調整成大的,就會變成:9.999×101+0.001234×101
0.001234在電腦的處理上,就會被當成很小的值而自動做rounding。
概括來說,轉換成大值再做加法有可能會造成overflow而產生錯誤的值,
而轉換成小值再做加法,則只會喪失一些精準度而已。
因此我們會選擇把小的exp調整成大的exp,而不是反過來。


【備註】

(1)
single precision的exponent用8個bit表示,
而我們先來看3-bit的例子。

左欄是原本的值,右欄是加了112的值,
可以發現加了11之後,紅色框的部分全都照大小排好了,
比原來的數字還要方便去判斷大小。
(原本還要先去看正負,然後再用不同的方式去比較大小)
這就是為什麼我們要加一個bias,
讓所有exponent都變成unsigned的原因。
其中綠色框的部分(000、111)為保留值,
為了要讓IEEE 754表示非正規的浮點數,
或是表示0、無限大這種特殊的浮點數。
接下來我們回來看8-bit的部分,
原本能表示的值為-128~127,把原本的數字加上12710
使得0、255成為保留值,剩下的都照大小排好,
1為最小的exponent,而254是最大的exponent。

我們在計算時為了要把exponent都align成一樣大,
首先必須要先判斷哪個數的exponent比較大,
但為了方便判斷大小,我們把exponent都變成unsigned,
使用的方式是加一個bias,
因此在還原回原來的數字時,要把bias減回來。
(2)
程式設計時的浮點數精準度問題


※圖片來源:交大資工李毅郎老師《計算機組織》課程上課講義

沒有留言:

張貼留言