計算機如何儲存浮點數
阿新 • • 發佈:2022-05-19
前言
計算機使用二進位制來儲存所有資料,對於整數,直接轉成二進位制就可以了,如int型別的15,二進位制表示為
00000000 00000000 00000000 00001111
對於浮點數,如何轉換成二進位制呢,答案是使用IEEE 754
標準。
原理
IEEE 754
規定,對於32位的浮點數,最高1位是符號位S,接著的8位是指數E,剩下的23位為有效數字M。
對於64位的浮點數,最高1位是符號位S,接著的11位是指數E,剩下的52位為有效數字M。
以32位浮點數為例,計算公式為
- S: 符號位,0表示正數,1表示負數。
- E: 指數
- M: 尾數
以32位浮點數3.25為例,轉為二進位制為11.01,規範表示為1.101 * 21,所以
S=0,
E=1+127=128,二進位制為10000000
M=101(省略掉左側的1之後),不足23位右側補0,超過23位擷取前23位,最終結果為
0 10000000 10100000000000000000000
十進位制表示為1078984704。
Java程式碼
public class Client { public static void main(String[] args) { System.out.println(Float.floatToIntBits(3.25f));//1078984704 System.out.println(Float.intBitsToFloat(1078984704));//3.25 System.out.println(Double.doubleToLongBits(3.25f));//4614500768194494464 System.out.println(Double.longBitsToDouble(4614500768194494464L));//3.25 } }
Java提供了符合IEEE 754
標準的表示浮點數的方法,將整型數和浮點數進行轉換。
注意
十進位制轉二進位制,如3.25,整數部分採用除2取餘,逆序排列
法,小數部分採用乘2取整
法,具體可以檢視10進位制轉2進位制。
小數部分在轉換時,有可能剩餘部分一直不為0,一直無限迴圈,我們只能根據精度取有限的位數,這也是浮點數會丟失精度的原因。如
System.out.println(0.3 - 0.2);//0.09999999999999998
結果不是預期的0.1。處理浮點數相關,推薦使用BigDecimal。