浮點數在計算機的儲存方式

該文章是我轉載的一篇文章,原文鏈接:https://blog.csdn.net/boatalways/article/details/17121205

對於一個整數,我們可以很方便的在十進制與二進制中轉換,但是對於一個浮點數來說不是這麼容易——因爲小數點的存在。對於浮點數來說,小數點的位置不是固定的(小數點後面的數的個數不定),所以如何存儲小數點是一個挑戰。後來人們想出用科學計數法通常如這般:3.12*10^5來表示浮點數,這樣的好處是:小數點的位置固定下來了。因爲計算機只能用01表示,所以我們用2來表示上面提到的那個10.

公式如下:
在這裏插入圖片描述
a爲浮點數的二進制表示,範圍爲[1,2) ;
e爲小數點移動的位數;

如:27.0表示成二進制爲:11011.0,用科學計數法表示爲1.10110*2^4.

那麼如何存儲1.10110*2^4這個數呢?

對於float型數據,其長度是4個字節,右邊23位用來表示小數點後面的數字,中間8位用來表示e,左邊一位用來表示正負。

對於double型數據,其長度是8個字節,右邊52位用來表示小數點後面的數字.中間11位表示e,左邊一位用來表示正負。如下圖:
在這裏插入圖片描述
指數偏移量=2^(k-1),k爲指數位個數。

因爲e可以爲正,可以爲負數。比如1.101102^4 這個e爲正數,如果是0.101那麼用指數表示就是1.012^-1,那麼e爲-1。同時要求先把e+指數偏移量,得到的結果再化成二進制,就是我們的指數位。

小數部分:把小數點後面的數字。如上面的10110,位數不夠就補零。

符號位:1表示負數,0表示正數

舉例子:

27.5的二進制爲11011.1

1.10111*2^4

尾數(小數點後的數)10111,補夠23位 1011 1000 0000 0000 0000 000

指數:4,加上127,就是131,二進制1000 0011

用二進制表示就是 (符號數位1位)0 (指數位8位)1000 0011 (尾數位23位)1011 1000 0000 0000 0000 000

寫成二進制標準形式:0100 0001 1101 1100 0000 0000 0000 0000

寫成16進制就是41 DC 00 00

那麼如何從二進制形式求出相應的十進制數呢?
先可以找出小數部分,指數位,以及符號位
1.通過符號位判斷正負
2.算出指數位代表的十進制,把這個十進制減去指數偏移量2^(k-1),結果爲正表明小數點往右邊便宜e位,負則左邊。
3小數部分有1,因爲都有,可以不需要在計算機中存儲,在這要表示出來結果是1.小數部分,如果e爲正數,則把小數點往右邊移動e位,負則是左邊

舉例子:
0x3fc00000
符號位:0 //說明是正數。
指數位:011 1111 1 //偏移0
小數位:100 0000 0000 0000 0000 0000,–>1.10000000000000000000000爲1.5
而按照規定,小數點前還隱含包括1,而這個1是不儲存的,所以小數位實際是1.5,當偏移大於0時,小數點向右偏移相應的值,反之向左偏移相應的值。
0x40c00000
符號位:0 //說明是正數。
指數位:100 0000 1 //偏移2

小數位:100 0000 0000 0000 0000 0000,
由於偏移爲2,1.100 0000 0000 0000 0000 0000變成了110.0 0000 0000 0000 0000 0000 所以0x40c00000值爲6
我們可以明白double變量的內存佈局了。由於小數位的計算方式比如11.11111…在計算時爲 121+1*20+12(-1)+1*2(-2)…可以看出在表示小數時,flaot的值不是連續的,事實上浮點數,以IEEE標準所能精確表示的僅僅是其中的一部分。

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