由于float与double大同小异,因此本文只讨论float。
float的存储结构
我们再通过int向float转换过程,来看看float具体是如何存储:
引自:Java中float的取值范围
float取值范围
根据公式:V=(-1)^s * M * 2^E
,我们可以得到:
最大值
令s=0,M=2,E=127
得到max=2^128=3.4*E^38【附】M其实不可能取得2,因此它只是个上限值而不可达
最小值
这里要注意:
2、非规格化值。当指数域的8个二进制数字为全0时,float数值就为这种情况。这时指数域所表示的十进制数为0,规定指数值为 E = 1 - (2^7 - 1),也就是E为定值-126;此时小数域的值仍表示f = 0.(f22)(f21)…(f1)(f0),但是M的值却变成M = f。
因此
令s=0,M=2^(-23),E=-126
【附】 M=2^(-23)的原因在于此时小数域的二进制表示为f = 0.(f22)(f21)…(f1)(f0),除f0=1外,其他全部为0
得到min=2^(-23)*2^(-126)=2^(-149)=1.4*E^(-45)
【注意】float的最小值Float.MIN_VALUE
求出的是正数不是负数,因为这里的最小值是代表精度的最小值;如果希望得到其正负数意义上的最小值,直接调用-Float.MAX_VALUE
即可。
关于IEEE 754
可以看Java浮点数。
不过里面有个错误:
该文作者自己也在“取值范围”一节中表达了疑惑,实际上就是该错误。