引用參考
https://www.cnblogs.com/chenmingjun/p/8415464.html#4291528
https://blog.csdn.net/yansmile1/article/details/70145416
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