计组—浮点数表示和运算
關注微信公眾號“蝦米聊吧” 獲取所有資料干貨,每天更新技術干貨,一起交流一起學習~
?
浮點數的表示
科學計數法
任意一個十進制數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相同,則向右破壞規格化
?
浮點數的溢出是以階碼溢出表現出來的(因為如果是尾數溢出可以通過相應的右移處理,所以尾數溢出稱為假溢出)。在加減法運算過程中要檢查是否產生了溢出;若階碼正常加(減)運算正常結束;若階碼溢出,則要進行相應處理
?
qq群 :557911445??個人qq:193459197
關注微信公眾號“蝦米聊吧”,后續持續放送“技術架構和資料”干貨!!!
???一個熱衷于分享技術和生活的程序猿,讓我們一起交流吧~??????
????????????????????
??????????????????微信掃描二維碼,關注我的公眾號
?
總結
以上是生活随笔為你收集整理的计组—浮点数表示和运算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计组—定点数的运算
- 下一篇: 全网最全Python项目体系练习500例