1. 程式人生 > >計組—浮點數表示和運算

計組—浮點數表示和運算

浮點數的表示

科學計數法

任意一個十進位制數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

位,0表示正數,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)時,表示的浮點數為無窮大

,結合符號位S為0或1,也有+無窮和-無窮之分

因此在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相同,則向右破壞規格化

浮點數的溢位是以階碼溢位表現出來的(因為如果是尾數溢位可以通過相應的右移處理,所以尾數溢位稱為假溢位)。在加減法運算過程中要檢查是否產生了溢位;若階碼正常加(減)運算正常結束;若階碼溢位,則要進行相應處理