浮点编码
浮點編碼
問題,如何在內存中表示小數?
float fltValue = 16.25; //fltValue對應的十六進制為多少?前期準備的知識,如何將十進制小數,轉變為二進制。?十進制的123的本質:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
同理:
? ? ? ? ? ? ? ? ?
所以,16.25變為二進制后為:10000.01
對于任意一個小數,其實都可以變為科學記數法表示。如:
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
對于二進制,也是完全類似的:
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
綜上,從科學計數法的角度看,任何數字,都可以分為3部分:
1. 符號 (+)
2. 精度 (1.00001)
3. 指數 (4)
float浮點編碼就是基于科學計數法發明的約定。?float,將4個字節(32位),被分割成3部分:
1、1bit: 符號位
2、中間的8bit: 指數
3、0~22的23bit: 精度位
具體的編碼過程:
? ??1. 將十進制小數,轉為二進制小數
? ??2. 將二進制小數轉為科學計數法
? ??3. 如果為負數,則符號位為1;正數則為0
? ??4. 對于指數部分,加上127后,存儲
? ??5. 精度部分,原樣保存(只保存小數部分,因為二進制的科學計數法的整數部分都是一樣的)
如:
將16.25編碼至內存 1. 10000.01 2. +1.000001 * 2^4 3. 符號部分:0 4. 指數部分:4+127 = 131,轉變成二進制:10000011 5. 精度部分:00000100000000000000000 最終,組合: 0 10000011 00000100000000000000000 0100 0001 1000 0010 0000 0000 0000 0000 => 0x41820000?
總結
- 上一篇: Mysql支持translate函数吗_
- 下一篇: java设置单元格为文本_怎样设置单元格