浮點數和IEEE754標準
- 前言
- 一、浮點數
- 1.浮點數的表示形式
- 2.浮點數的規格化
- 二、IEEE754標準
- 三、我們回歸到最開始的問題
- 1. 為什么float是32位的,但表示的數值范圍比64位的long還大?
- 2.計算機如何存盤浮點數?
前言
??我們知道float型別占4個位元組,long型別占8個位元組,但是與“常識”相反的是:float的存盤范圍要比long的存盤范圍大,64位的long型別可以自動轉換成32位的float型別(存在精度丟失可能),
- 為什么float是32位的,但表示的數值范圍比64位的long還大?
- 計算機又是如何存盤浮點數的?
??如果你有困惑,那一起來了解下浮點數和IEEE754吧!
一、浮點數
1.浮點數的表示形式
??浮點數,見名知意,小數點位置不固定的數,在計算機中,根據小數點是否固定將資料分為浮點數和定點數,
官方回答:以適當的形式將比例因子表示在資料中,讓小數點的位置根據需要進行浮動,
浮點數表示為: N = rE * M
r是浮點數階碼的底,與尾數的基數相同,通常r=2,E和M都是有符號的定點數,E稱為階碼,M稱為尾數,
在計算機中表示一個浮點數時,
- 給出尾數M,用小數形式表示;
- 給出指數E,用整數形式表示,常稱為階碼
尾數部分給出有效數字的位數,決定浮點數的表示精度;
階碼部分指明小數點在資料中的位置,決定了浮點數的表示范圍
2.浮點數的規格化
為了提高運算的精度,需要充分利用尾數的有效位數,通常采取浮點數規格化形式,既規定尾數的最高數位必須是一個有效值,非規格化浮點數需要進行規格化操作才能變成規格化浮點數,所謂規格化操作,是指通過調整一個非規格化浮點數的尾數和階碼的大小是非零的浮點數在尾數的最高位數上保證是一個有效值,
25 *1.10101
左規一次得到規格化形式: 24 *1.0101
二、IEEE754標準
按照IEEE754標準,常用的浮點數的格式如下圖所示

IEEE754規定的常用格式有單精度浮點數、雙精度浮點數和臨時浮點數(不做討論),見下表,
| 型別 | 數符 | 階碼 | 尾數數值 | 總位數 | 最大指數 | 最小指數 | 偏置值 |
|---|---|---|---|---|---|---|---|
| 單精度 | 1 | 8 | 23 | 32 | +127 | -126 | 127 |
| 雙精度 | 1 | 11 | 52 | 64 | +1023 | -1022 | 1023 |
| 臨時浮點數 | 1 | 15 | 64 | 80 | +16383 | -16382 | 16383 |
??IEEE754標準的浮點數,是尾數用采取隱藏位策略的原碼表示,且階碼用移碼表示的浮點數,
??以float浮點數為例,最高位為數符位;其后是8位階碼,以2為底,用移碼表示,階碼的偏置值為28-1-1=127;其后23位是原碼表示的尾數數值位,對于規格化的二進制浮點數,數值的最高位總是“1”,因此尾數數值實際上是24位 ,隱含的“1”是一位整數,在浮點格式中表示的23位尾數是純小數,例如,(12)10=(1100)2,將它規格化后結果為1.1×23,其中整數部分的“1”將不存盤在23位尾數內,
根據浮點數的規格化方法,尾數域的最高有效位總是1,該標準約定這一位不予存盤,而是認為隱藏在小數點的左邊,所以,尾數域所表示的值是1.M(實際存盤的是M),這樣可使尾數的表示范圍比實際存盤多一位,
??存盤浮點數階碼部分之前,偏置值要先加到階碼真值上,上例中,階碼值為3,因此在float浮點數中,移碼表示的階碼為127+3=130(82H);若在double浮點數中,階碼則為1023+3=1026(402H),
階碼用移碼的原因:移碼可以直觀地看出數的大小,這樣就使得浮點數加減法操作起來更方便,當然,此時需要在階碼真值上加上一個偏移量,
相應的,在IEEE754標準中,規格化浮點數的真值為:
(-1)s * 1.M *2E-127
式中s=0表示正數,s=1表示負數;E的取值為1~254(8位),M為23位,共32位,
空出8位全為1來表示無窮大;階碼值E的范圍是1~254,空出全0表示非規格化數,
三、我們回歸到最開始的問題
1. 為什么float是32位的,但表示的數值范圍比64位的long還大?
??我想你已經有答案了,float型有指數部分,規約數的指數可以表示到2127,差不多是1038那么大,
??從資訊論的角度看,有了IEEE 754對編碼格式的規定,我們知道哪個是符號位,哪些是指數部分,哪些是小數部分,以及省略的最高位的1,所以float型32個bit才能存下這么多資訊,
2.計算機如何存盤浮點數?
比如十進制的11.0,寫成二進制就是1011.0,
用IEEE標準表示:(-1)0 × 1.011 × 23 ,s=0,M=1.011,E=3,
那么,計算機是如何存盤s,M,E這三個值呢?
可以理解存盤格式為:SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM
所以,如果按單精度(32位)浮點數存盤,計算機會在記憶體中開辟一個32位的存盤空間,最高1位保存0,中間8位保存E+127,最后23位保存M的小數部分
以上內容,簡單的對浮點數和IEEE754標準做了總結,我的第一篇博客,如有錯誤之處,還望指正.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/249066.html
標籤:其他
