Java語言中:float、double數據類型在內存中是如何存儲的

java語言中,float類型數字在計算機中用4個字節(32位)來存儲。double類型佔用8個字節(64位)。 從存儲結構和算法上來講,double和float是一樣的,不一樣的地方僅僅是float是32位的,double是64位的,所以double能存儲更高的精度。

  按照IEEE制定的浮點數表示法來進行float,double運算。這種結構是一種科學計數法:用符號指數尾數來表示。指數可正可負,所以,IEEE規定,此處算出的次方必須減去127纔是真正的指數。底數定爲2,即把一個浮點數表示爲尾數乘以2的指數次方再添上符號

下面是具體的規格: 

類型 符號位 指數 尾數 長度
float 1 8 23 32
double 1 11 52 64

以float爲例:

  因爲指數需要減去127,所以float類型的指數可從-126到128

科學計數法:

  格式:
   SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM

   S表示浮點數正負

   E表示指數加上127的值後得到的二進制數據

   M表示尾數,最高位固定爲1

  舉例

    17.625在內存中的存儲爲:

    首先要把17.625換算成二進制:10001.101。

    整數部分:除以2,直到商爲0,餘數反轉。(即:模2取餘法)

       17 % 2 = 8  ---> 1    低位

        8 % 2 = 4  ---> 0

        4 % 2 = 2  ---> 0

        2 % 2 = 1  ---> 0

        1 % 2 = 0  ---> 1   高位

       小數部分:乘以2,直到乘位爲0,進位順序取。(即:乘2取整法)

      按如下算法進行: 

        1)首先給小數部分乘2,得到的數,如果小數點前爲1;則計1,爲0,則計0。

        2)再對剩下的小數部分乘2,再計出1或0。 

        3)重複以上步驟,直至達到需要的精度。

      0.625 x 2 = 1.25   --->  1  -1位

      0.25  x 2 = 0.5    --->  0  -2位

      0.5   x 2 = 1.0    --->  1  -3位

      0.0   x 2 = 0.0    --->  0  -4位

      ........

      以上得到17.625換算成二進制爲10001.101。

     再將10001.101右移,直到小數點前只剩1位,1.0001101 * 24 ,右移動了四位。

      此時,底數和指數就出來了。

      底數:因爲小數點前必爲1,所以IEEE規定只記錄小數點後的就好。所以,此處的底數爲:0001101

      指數:實際爲4,必須加上127(轉出的時候,減去127),所以爲131。也就是10000011

        符號:因爲是正數,所以是0

   綜上所述,17.625在內存中的存儲格式是:01000001 10001101 00000000 00000000

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