理解浮點數的二進制表示

目錄

 

二進制的科學計數法

浮點數的二進制表示

符號位、尾數和指數(以64位浮點數爲例)

0、規約數和非規約數

無窮大和空值NaN


二進制的科學計數法

       浮點數在電腦中用二進制儲存,約定以二進制的科學計數法來進行表示一個浮點數,類比十進制的科學計數法,很容易知道,二進制的科學計數法的首位數字一定爲1,然後通過乘以相應的底數爲2的指數來得到二進制數,如下所示。

       下面等號左邊是原二進制數,右邊就是其二進制的科學計數表示。和十進制一樣,二進制的科學計數表示之後,也具有有效數字(尾數)、底數和指數,只是二進制的有效數字由0和1組成,底數爲2。

1110011=1.110011\cdot 2^{6}

浮點數的二進制表示

       所以,浮點數的二進制表示包括符號、尾數和指數。比如對於32位浮點數來說,1位符號位、23爲尾數位和8位指數位;對於64位浮點數來說,1位符號位、52位尾數位和11位指數位。尾數以二進制的科學計數法約定表示,因爲對於所有約定的規約數來說,首位都是1,所以首位的1會被默認省去,所以對於64位浮點數,其有效精度可以達到二進制的53位;指數的底數爲2,由於爲了表示小數,故指數也有正負,爲了表示負數,所以指數通過移碼的方式進行轉化。

       以64位浮點數爲例,如下所示。從0-63共有64個bit,其中首位用來表示符號,0爲正,1爲負。接下來11位bit用來儲存指數,剩下的52位用來儲存尾數。

符號位、尾數和指數(以64位浮點數爲例)

       符號位很簡單,就是約定0表示正,1表示負。對於尾數,其有52位bit,但是根據二進制的科學計數法,首位都爲1,因此我們可以省略掉這個1,這樣子52位都可以用來儲存尾數的小數部分,因此實際上52位尾數小數的有效尾數有共有53位,只是首位的1被省略了。對於指數,有11bit,但是爲了表示負數,採用二進制指數值-偏移量的計算方式得到計算中的指數值;比如64位的指數偏移量約定爲1023,11bit可以表示的值的範圍爲0~2047的整數,但是這裏真正被用作指數計算的只有1~2046,0和2047這兩個數字被剔除,以用來表示特殊值,這個文章後面再說明;因此,1~2016減去偏移量1023後,真正的指數取值範圍爲-1022~1023。所以64位浮點數的具體的二進制表示方式如下。

       

0、規約數和非規約數

       So far so good! 問題來了,怎麼表示0?由於上述定義中,尾數始終是大於1的,所以無論如何也無法得到0,因此0這個需要特殊定義。根據上述的定義,即指數範圍在1~2046之間,有效數字首位爲1的浮點數,叫做規約數(normal numbers)。同時還注意到,上述在講指數的時候,有兩個值是沒有用到的,即0和2047,對應着指數部分11個bit分別全部爲0和全部爲1的情形。所以爲了表示0,約定當指數部分全部爲0,且尾數小數部分也全爲0的時候,表示0;要注意的是,雖然本文這裏說的是尾數的小數部分全爲0,但是實際上這時,首位隱藏的1變成了0。

       接下來的問題是,如果指數部分全爲0,但是尾數的小數部分不全爲0,這時該表示什麼?因爲對於規約數的定義,我們研究指數部分的值在1~2046之間,而指數爲0時,就超出了規約數定義的範圍了,因此,當指數爲0,但是尾數小數部分不全爲0時,我們定義這樣的數爲非規約數(denormal numbers or subnormal numers)。要注意的是,非規約數的指數一定是爲0的,但是這時偏移量變成了1022;即當指數爲0時,那麼不僅尾數首位隱藏值從1變成0,而且約定偏移量這時爲1022,即移碼後的指數依然保持-1022不變(注意不是-1023),以該移碼後的指數(即-1022)去計算非規約數的大小。

無窮大和空值NaN

       至此,我們還有一個數沒有說明,那就是指數的2047,即指數全爲1時的情形。我們約定,當指數全爲1,且尾數小數部分全爲0時,表示無窮大,然後根據符號的不同,有正無窮大和負無窮大。但是當指數全爲1,但是尾數的小數部分不全爲0時,表示什麼呢?這樣的數字實際上是未定義的,所以約定其爲NaN(Not a Number),所以可知,實際上NaN的情形是很多的,在對NaN進行比較時,系統約定其是不相等的,因爲我們不能通過等號來判斷NaN值,由於NaN實際上也有有二進制表示的,所以其不是一個空對象,也不能用是否爲空對象來判斷;這也是爲什麼pandas中判斷一個值是否爲NaN需要使用規定的函數,不能直接使用等號判斷和空對象判斷的原因,具體的pandas中的判斷方式可以看這篇文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章