综述
在 Java 虚拟机中,浮点数有 float 和 double 两种,分别是 32 位和 64 位浮点数,目前,使用最为广泛的是由 IEEE754 定义的浮点数格式。目前 Java 虚拟机中对于浮点数的处理参考 IEEE754 的规范。
float
本节将以 float 为例,简要介绍浮点数的表示方法。
在 IEEE754 的定义中,一个浮点数由 3 部分组成,分别是:符号位、指数位和尾数位。以
32 位 float 为例,符号位占 1 位,用 s
表示表示正负数,指数位占 8 位,用 e
表示。尾数位占剩余的 23 位,
用 m
表示
sflag*m*2^(e-127)
其中,sflag 表示符号,当 s 为 0 时,sflag 为 1,当 s 为 1 时,sflag 为-1。m 为尾数值,实
际占用空间为 23 位,但是根据 e 的取值,有 24 位精度。当 e 全为 0 时,尾数位附加为 0,否
则,尾数位附加为 1。e 为指数位,用 8 位表示。
举例
以浮点数-5 为例,其内部表示为:
11000000101000000000000000000000
内部表示可以通过以下代码打印
System.out.println(Integer.toBinaryString(Float.floatToRawIntBits(a)));
符号位为 1 表示负数,
指数位为 10000001,表示 129。
尾数位为:01000000000000000000000。因为 e 不全为 0,故实际的尾数位为:
101000000000000000000000,最前面的 1 是根据 e 添加的,参与运算,但不参与展示。
尾数位表示 2 的指数次幂的和,每一位表示求和数列中的对应项是否为 0,这里表示:
1*2^0+0*2^1+1*2^2+0*2^3+0*2^4+0*2^5
故 11000000101000000000000000000000 的值为:
-1*2^(129-127)*(1*2^0+0*2^1+1*2^2+0*2^3+0*2^4+0*2^5)=-1*4*1.25=-5
特殊数字
浮点数 float 还可以表示一些特殊的数字
正无穷01111111100000000000000000000000
负无穷11111111100000000000000000000000
NaN01111111110000000000000000000000
最大浮点数(3.4028235E38)01111111011111111111111111111111
最小规范化正浮点数(1.17549435E-38)00000000100000000000000000000000
最小正浮点数(1.4E45)00000000000000000000000000000001
000000000000000000000000000000000
其中,指数位全为 1 的表示无穷大和 NaN 等特殊数字。指数位全为 0 的为非规范化的浮点数。
System.out.println(工 nteger.toBinaryString(Float.floatToRawIntBits(a)));
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于