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為例:

  因為指數需要減去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

如果你覺我寫的,對你還有點用,可以關注公眾號“微家頻道”。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容