計組—浮點數表示和運算
浮點數的表示
科學計數法
任意一個十進位制數N可以寫成:
同樣,在計算機中一個任意進位制數N可以寫成
在計算機的世界裡R預設是2,表示二進位制,因此R在計算機中不用單獨儲存,而M和e需要單獨儲存
尾數(M):用定點小數表示,給出有效數字的位數,決定了浮點數的表示精度
階碼(E):表示指數(並不等同於e,他們之間有一種對應關係),用整數形式表示,指明小數點在資料中的位置,決定了浮點數的表示範圍
比例因子(R):不表示,預設值,一般為2
問題:在計算機中各個部分分別佔據多少位?
IEEE754標準浮點數的表示方法
單精度float總共32位,
32位的浮點數中:
S:浮點數的符號位(即最高位表示符號位),佔1位,0表示正數,1表示負數
M:尾數,佔23位,用小數表示,小數點放在尾數域的最前面
E:階碼,佔8位,階符采用隱含方式,即採用移碼方式來表示正負指數
指數e和階碼E之間的對應關係,應將指數e加上一個固定的偏移值,即:E=e+127
IEEE754標準中,一個規格化的32位浮點數 x的真值可表示為:
其中(-1)^s,s表示符號位,s=0則(-1)^0=1為正數,s=1則(-1)^1=-1為負數;
M表示階碼,預設為1 * M,e=E-127
其中,S、M、E都存在計算機中,而其它數值都是預設固定的
64位的浮點數:
S:浮點數的符號位(即最高位表示符號位),佔1
M:尾數,佔51位,用小數表示,小數點放在尾數域的最前面
E:階碼,佔11位,階符采用隱含方式,即採用移碼方式來表示正負指數
同理一個規格化的64位浮點數x的真值為:
例:
說明:
(1.75)10 = 1.11 * 2^0
對於32位的浮點數來說:
所以因為是正數S=0
因為是1.M的格式,所以M=1100000...0 (因為總共23位,存在2個1,所以後面21個0)
因為e=0,而E=127+e,所以E=127
補充說明:
(1)當階碼E為全0(0000,0000)且尾數M也為全0時,表示的真值x為零,結合符號位S為0或1,有正零和負零之分。
(2)當階碼E位全1(1111,1111即255)且尾數M為全0(0000,0000)時,表示的浮點數為無窮大
因此在32位浮點數表示中,要除去E用全00000000和全11111111(255)10表示零和無窮大的特殊情況,因此階碼E的取值範圍為00000001(1)到11111110(254);又因為e=E-127,所以e的取值範圍為(1-127) ~ (254-127)即 -126 ~ +127
浮點數的加減運算
兩浮點數進行加法和減法的運算規則即操作過程大體分為四步:
1.0運算元的檢查
判斷兩個運算元x或y中有一個數為0,則直接得出結果
2.比較階碼大小並完成對階
判斷兩個運算元的階碼是否相同,如果相同則直接進行尾數的加減法運算。如果不同則需要使兩個運算元的階碼相同即對階,首先求出兩個數的階差,由於尾數左移會引起最高有效位的丟失,造成很大的誤差,尾數右移雖引起最低有效位的丟失,但造成的誤差較小,因此對階操作規定使尾數右移,尾數右移後階碼作相應增加,其數值保持不變。顯然,一個增加後的階碼與另一個階碼相等,增加的階碼一定是小階。
因此對階的原則是小階向大階看齊,即小階的位數向右移位(相當於小數點左移)每右移一位,其階碼加1,直到兩數的階碼相等為止,右移得位數等於階差。
3.尾數進行加或減法運算
4.結果規格化並進行舍入處理
規格化:
1/2 =< |M| < 1
(M是小數,所謂M>=1/2 即:|M|>=0.1,因為是按二進位制處理,1/2即右移一位即0.1)
但在浮點運算中,尾數求和結果的絕對值大於1(即溢位符號位為01或10),叫做向左破壞了規格化;此時將尾數運算結果右移以實現規格化表示,稱為向右規格化;尾數右移一位,階碼加1;以保證浮點數大小不變;
運算結果的絕對值小於1/2,叫做向右破壞規格化,此時將尾數結果左移實現規格化表示,稱為向左規格化;尾數左移一位,階碼減1,以保證浮點數大小不變;
(1)尾數用原碼錶示,[S]原=Sf.S1S2....Sn,如果尾數未發生溢位,但S1=0,則向右規格化,即S1必須等於1,否則需要進行規格化處理
(2)尾數用補碼來表示,[S]補=Sf.S1S2....Sn,如果尾數未發生溢位,但Sf 異或 S1=0,即Sf和S1相同,則向右破壞規格化
浮點數的溢位是以階碼溢位表現出來的(因為如果是尾數溢位可以通過相應的右移處理,所以尾數溢位稱為假溢位)。在加減法運算過程中要檢查是否產生了溢位;若階碼正常加(減)運算正常結束;若階碼溢位,則要進行相應處理