轉載參考:http://share.onlinesjtu.com/mod/tab/view.php?id=176
http://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.html
http://baike.baidu.com/link?url=heUWO1s1ygzWlf_ZQ0nzfKcJQFmosbGJVzkOCvInmNRcISY_bSfsjaDaxgGjOlJcMwFKKIMf3z9Ml0hW6xQi7_
在定點數表示中存在的一個問題是,難以表示數值很大的數據和數值很小的數據。例如,電子的質量(9×10-28克)和太陽的質量(2×1033克)相差甚遠,在定點計算機中無法直接表示,因為小數點只能固定在某一個位置上,從而限制了數據的表示范圍。
為了表示更大范圍的數據,數學上通常采用科學計數法,把數據表示成一個小數乘以一個以10為底的指數。
例如,在計算機中,電子的質量和太陽的質量可以分別取不同的比例因子,以使其數值部分的絕對值小於1,即:
9×10-28 = 0.9×10-27
2×1033 = 0.2×1034
這里的比例因子10-27和1034要分別存放在機器的某個單元中,以便以后對計算結果按此比例增大。顯然,這要占用一定的存儲空間和運算時間。
浮點表示法就是把一個數的有效數字和數的范圍在計算機中分別予以表示。這種把數的范圍和精度分別表示的方法,相當於數的小數點位置隨比例因子的不同而在一定范圍內自由浮動,改變指數部分的數值相當於改變小數點的位置。在這種表示法中,小數點的位置是可以浮動的,因此稱為浮點表示法。
浮點數的一般表示形式為:
一個十進制數N可以寫成:N = 10e×M
一個二進制數N可以寫成:N = 2e×M
其中,M稱為浮點數的尾數,是一個純小數;e是比例因子的指數,稱為浮點數的指數,是一個整數。在計算機中表示一個浮點數時,一是要給出尾數M,用小數形式表示;二是要給出指數e,用整數形式表示,常稱為階碼。尾數部分給出有效數字的位數,因而決定了浮點數的表示精度;階碼部分指明了小數點在數據中的位置,因而決定了浮點數的表示范圍。浮點數也是有符號數,帶符號的浮點數的表示如圖2-2所示。
其中,S為尾數的符號位,放在最高一位;E為階碼,緊跟在符號位之后,占m位;M為尾數,放在低位部分,占n位。
1. 規格化浮點數
若不對浮點數的表示做出明確規定,同一個浮點數的表示就不是惟一的。例如:
(1.75)10 = (1.11)2 = 1.11×20
= 0.111×21
= 0.0111×22
= 0.00111×23
為了提高數據的表示精度,需要充分利用尾數的有效位數。當尾數的值不為0時,尾數域的最高有效位應為1,否則就要用修改階碼同時左右移動小數點的辦法,使其變成符合這一要求的表示形式,這稱為浮點數的規格化。
2. IEEE-754標准浮點格式
在IEEE-754標准出現之前,業界並沒有一個統一的浮點數標准,相反,很多計算機制造商都在設計自己的浮點數規則以及運算細節。
為了便於軟件的移植,浮點數的表示格式應該有一個統一的標准。1985年,IEEE(Institute of Electrical and Electronics Engineers,美國電氣和電子工程師協會)提出了IEEE-754標准,並以此作為浮點數表示格式的統一標准。目前,幾乎所有的計算機都支持該標准,從而大大改善了科學應用程序的可移植性。
IEEE標准從邏輯上采用一個三元組{S, E, M}來表示一個數N,它規定基數為2,符號位S用0和1分別表示正和負,尾數M用原碼表示,階碼E用移碼表示。根據浮點數的規格化方法,尾數域的最高有效位總是1,由此,該標准約定這一位不予存儲,而是認為隱藏在小數點的左邊,因此,尾數域所表示的值是1.M(實際存儲的是M),這樣可使尾數的表示范圍比實際存儲多一位。為了表示指數的正負,階碼E通常采用移碼方式來表示,將數據的指數e 加上一個固定的偏移量后作為該數的階碼,這樣做既可避免出現正負指數,又可保持數據的原有大小順序,便於進行比較操作。
目前,大多數高級語言都按照IEEE-754標准來規定浮點數的存儲格式。IEEE-754標准規定,單精度浮點數用4字節(即32位)存儲,雙精度浮點數用8字節(即64位)存儲,如圖2-3所示:
單精度格式(32位):符號位(S)1位;階碼(E)8位,階碼的偏移量為127(7FH);尾數(M)23位,用小數表示,小數點放在尾數域的最前面;
雙精度格式(64位):符號位(S)1位;階碼(E)11位,階碼的偏移量為1023(3FFH);尾數(M)52位,用小數表示,小數點放在尾數域的最前面。
在IEEE-754標准中,一個規格化的32位浮點數X的真值可表示為:
X = (-1)s×(1.M)×2 E-127 e = E-127 (式2-9)
在IEEE-754標准中,一個規格化的64位浮點數X的真值可表示為:
X = (-1)s×(1.M)×2 E-1023 e = E-1023 (式2-10)
由於雙精度格式的原理與單精度格式相同,僅僅是表示的位數有所增加,所以,下面主要介紹單精度格式(32位)浮點數的表示方法。
當階碼E為全0時,若尾數M也為全0時,表示的真值X為零,結合符號位S為0或1,有正零和負零之分。若M非全0,這時,浮點數的指數E等於1-127(或者1-1023),有效數字M不再加上第一位的1,而是還原為0.xxxxxx的小數。總之,這樣做是為了表示±0,以及接近於0的很小的數字。
當階碼E為全1時,若尾數M也為全0時,表示的真值X為無窮大(∞),結合符號位S為0或1,有+∞和-∞之分。如果有效數字M不全為0,表示這個數不是一個數(NaN)。
當E不全為0,不全為1。這時,浮點數就采用上面的規則表示,即指數E的計算值減去127(或1023),得到真實值,再將有效數字M前加上第一位的1。
這樣,在32位浮點數表示中,要除去E用全0和全1(255)表示零和無窮大的特殊情況,因此,階碼E的取值范圍變為1~254,指數的偏移量不選128(10000000B),而選127(01111111B)。對於32位規格化浮點數,真正的指數值e為-126~+127,因此,數的絕對值的范圍是2-126~2127≈10-38~1038。
補充說明:
在單精度表示中,以8位二進制存儲指數(階碼)。原本的范圍是-127~128(余碼系統)。余127碼后,加上偏移量,范圍變成0~255。由之前的討論,去除全0和全1的階碼,階碼E的取值范圍變為1~254即真正的指數值e為-126~ +127。
由此我們計算單精度浮點表示法可以表示的數的最大絕對值:1.11………1(23個1)最大尾數,再化為十進制,再乘以2^127 (階碼可以表示的最大指數),結果=(1-2^-24)*2^128
= 3.4028234663853 * 10 38
計算單精度浮點表示法可以表示的數的最小絕對值 :(1-2^-1)*2^-127 =2.9387358770557 * 10 -39(這個值我暫時不會計算,求教)
超出最大絕對值的數為上溢,小於最大絕對值的數為下溢。