初步瞭解機器中浮點數表示方法

浮點數是小數點位置變化的數,能表示的範圍比定點數大不少。web

好比二進制數11.11能夠表示爲111.1×2-1或1.111×21等,咱們由此規律能獲得二進制數更通常形式N=2E×F,E稱爲階碼,F稱爲尾數。這個數在機器裏怎麼存呢,是把正負符號、二、E、E的正負號、F轉爲01序列存起來嗎?svg

若是由咱們本身來設計計算機,這樣的確能夠,不過總有人會想出更聰明的辦法。首先符號位必須佔一位,2能夠省略不存,默認的。階碼E轉爲移碼存,這樣就不用存階碼的正負符號了。最後是很講究的尾數,尾數爲0固然直接存0,不爲0時,尾數域的最高位必須爲1,好比0.001×20必需要變0.1×2-2,也就是小數點後不能爲0,像0.001小數點後爲0,就要變化階碼,使得小數點移到1前變成0.1,而後只存小數點以後的數,這個過程叫尾數規格化。設計

因此通常來講,浮點數的機器碼錶示以下:xml

符號位 階碼 (移碼) 尾數(定點小數)

現實中具體到底如何實現有許多方法,好比階碼放在尾數後,符號位放在階碼後,階碼用補碼錶示等。
用一道題目來幫助理解:
在這裏插入圖片描述
在這裏插入圖片描述
如圖1所示爲計算機中16位浮點數的表示格式。
某機器碼爲1110001010000000。
若階碼爲移碼且尾數爲反碼,其十進制真值爲 (1) ;
若階碼爲移碼且尾數爲原碼,其十進制真值爲 (2) ;
若階碼爲補碼且尾數爲反碼,其十進制真值爲 (3) ;
若階碼爲補碼且尾數爲原碼,其十進制真值爲 (4) ,將其規格化後的機器碼爲 (5) 。
(1) ~ (4)
A.0.078125
B.20
C.1.25
D.20.969375
(5)
A.1110001010000000
B.11110101000000
C.1101010100000000
D.11110001010000
blog

個人分析:
(1)階碼爲移碼,即1110爲移碼,對應原碼爲0110,其十進制真值爲6,尾數001010000000爲反碼,正數反碼換成原碼爲原形式,其對應十進制真值爲2-2+2-4=0.3125,因此整個數十進制真值爲26×0.3125=20
(2)階碼爲移碼,尾數爲原碼,和(1)是同樣的。圖片

(3)階碼爲補碼,補碼1110對應的原碼爲1010,即-2,尾數爲反碼,(1)已經分析過爲0.3125,則整個數十進制真值爲2-2×0.3125=0.078125
(4)階碼1110爲補碼,真值爲-2,尾數爲原碼,同(3)it

(5)浮點數規格化表示,是尾數值不爲0時,尾數域最高有效位要爲1,好比0.001×20必需要變0.1×2-2, 題目中尾數域爲001010000000第一個0爲符號位無論,第二個0是能夠消去的,變成010100000000,這樣消去後,階碼要相應地減1變爲1101,故規格化後的機器碼1101010100000000table

有個名叫IEEE-754的標準就統一了浮點數具體實現方法,目前大多數高級語言都按照IEEE-754標準來規定浮點數的存儲格式,好比Java,還有咱們熟知的C語言。webkit

按IEEE-754標準定義的單精度浮點數float:二進制

符號位 階碼 (移碼) 尾數(定點小數)
0位 1~8位 9~31位

雙精度浮點數double

符號位 階碼 (移碼) 尾數(定點小數)
0位 1~11位 12~63位

IEEE-754中尾數的規格化有所不一樣,以前咱們說尾數規格化規定小數點後爲1,IEEE-754中就將此固定的1設爲默認值去掉了,所以尾數域表示的值爲1.xxxx(只存儲xxxx,1是默認有的),這樣使得尾數表示範圍多上一位。

IEEE-754中階碼的移碼也有特別規定,要除去階碼的全0和全1狀態,所以像float中階碼的取值不是0~255,而是1 ~ 254,也就是說這裏的階碼的移碼不是簡單地由補碼變符號而來,還要減1,換個說法就是偏移量不爲128了,而爲127。因此對於float來講,真正指數的範圍爲-126 ~+127,所表示的數範圍也就爲2-126 ~2127即10-38 ~1038
舉個栗子
在這裏插入圖片描述
將176.0625表示爲符合IEEE-754標準的單精度浮點數。

  1. 首先將176.0625化爲二進制:10110000.0001
  2. 尾數規格化:1.01100000001×27,所以尾數域求出來了,爲01100000001
  3. 階碼的移碼:7的二進制爲00000111,移碼爲10000110。
  4. 拼接:0 10000110 01100000001000000000000 尾數域記得要補0使尾數有23位。
相關文章
相關標籤/搜索