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

引用參考html

https://www.cnblogs.com/chenmingjun/p/8415464.html#4291528java

https://blog.csdn.net/yansmile1/article/details/70145416算法

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

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

下面是具體的規格: htm

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


  

 

 

 

以float爲例:blog

  由於指數須要減去127,因此float類型的指數可從-126到128內存

科學計數法:table

  格式:
    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

相關文章
相關標籤/搜索