Java浮点数

由于float与double大同小异,因此本文只讨论float。

float的存储结构

引自:Java中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浮点数

不过里面有个错误:

这里写图片描述

该文作者自己也在“取值范围”一节中表达了疑惑,实际上就是该错误。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值