java虛擬機中的浮點數分爲float和double兩種,分別爲32位和64位.它參考了IEEE 754的規範對浮點數進行處理。下面以float爲例 ,分析一下float數的表示方法.
float的32位分成三個部分來表示一個浮點數:
浮點數的取值計算公式爲:
解析:
1) 當符號位s的取值爲0時,sflag爲1, 當s爲1時,sflag爲-1. 所以有:
2) e 爲指數位,用 8 位表示
3) m 爲尾數值,佔用空間爲23位,但是根據 e 的取值,有 24 位精度。所以引入了一個附加位,規則如下: m的值會根據e的值會動態變化。 當8個指數位e全部爲0,尾數位m附加0(在左邊附加),否則,附加1.
以-5的表示爲:
System.out.println( Integer.toBinaryString(Float.floatToRawIntBits(-5)) );
結果爲:
1 1000 0001 0100 0000 0000 0000 0000 000
符號位 指數位 尾數位
指數位1000 0001
不全爲0,所以尾數位(從左邊)附加1,實際 尾數位爲:
1 + 010 0000 0000 0000 0000 0000 = 1010 0000 0000 0000 0000 0000
按照上面的公式:
計算各部份的值:
1) sflag: -1
2) m的計算複雜點,尾數位表示2的指數次方的和。計算過程:
3) 尾數位:
所以,結果爲: