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) 尾数位:
所以,结果为: