轉載參考:http://share.onlinesjtu.com/mod/tab/view.php?id=176php
http://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.htmlhtml
http://baike.baidu.com/link?url=heUWO1s1ygzWlf_ZQ0nzfKcJQFmosbGJVzkOCvInmNRcISY_bSfsjaDaxgGjOlJcMwFKKIMf3z9Ml0hW6xQi7_ url
在定點數表示中存在的一個問題是,難以表示數值很大的數據和數值很小的數據。例如,電子的質量(9×10-28克)和太陽的質量(2×1033克)相差甚遠,在定點計算機中沒法直接表示,由於小數點只能固定在某一個位置上,從而限制了數據的表示範圍。spa
爲了表示更大範圍的數據,數學上一般採用科學計數法,把數據表示成一個小數乘以一個以10爲底的指數。設計
例如,在計算機中,電子的質量和太陽的質量能夠分別取不一樣的比例因子,以使其數值部分的絕對值小於1,即:htm
9×10-28 = 0.9×10-27blog
2×1033 = 0.2×1034數學
這裏的比例因子10-27和1034要分別存放在機器的某個單元中,以便之後對計算結果按此比例增大。顯然,這要佔用必定的存儲空間和運算時間。it
浮點表示法就是把一個數的有效數字和數的範圍在計算機中分別予以表示。這種把數的範圍和精度分別表示的方法,至關於數的小數點位置隨比例因子的不一樣而在必定範圍內自由浮動,改變指數部分的數值至關於改變小數點的位置。在這種表示法中,小數點的位置是能夠浮動的,所以稱爲浮點表示法。io
浮點數的通常表示形式爲:
一個十進制數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(這個值我暫時不會計算,求教)
超出最大絕對值的數爲上溢,小於最大絕對值的數爲下溢。