IEEE-754单精度浮点类型有效数字理解(画图不易,望点赞支持)

32位浮点类型有效数字

单精度浮点类型有效数字为7位,是指数字存储过大导致尾数位存储溢出而失去精度,成功保留下来的真实数字。例如:存储16777217(2^24+1)时,程序中实际存储的是其实是16777216,而 16777217 与 16777216 只有最后1位数字是不相同的,其余的7位数字都是相同的,这代表单精度浮点类型的有效数字为7位。

精度丢失

存储16777216(2^24)时,尾数位已经达到了24位,超出1位了,而超出的那1位将会被省略掉,但是指数位上却依然记住它的是24位,因此在存储时会将省略掉的尾数当做零处理;即便你存储的是11111111,它也会全部把它当做0处理,即00000000,所以此时就有可能出现存储的数据与实际浮点是的值有差异,但是因为被省略掉的是0的原因,所以 16777216 并没有受到影响。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MRyzWsjH-1650288589473)(重拾java基础/pic/image-20220408152158023.png)]

但是,如果我们存储 16777217 ,此时被省略掉的那一位是1,所以它的值已经发生变化了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JHEN7jGV-1650288589474)(重拾java基础/pic/image-20220413155322993.png)]

我们用格式化输出方法打印一下,发现它打印出来的值竟然是16777216,最后1位数字的精度已经丢失。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dJAcgSFK-1650288589475)(重拾java基础/pic/image-20220408155447275.png)]

这个原因很简单,不管是16777216还是16777217,它们都被省略掉了最后一位;不管最后一位是1还是0,程序都把它当做0来处理,所以它们在程序中是没有差别的。因此我们得出一个结论,那就是不管是整数还是小数,存储到单精度浮点类型中,只要规范化超过24位,就有可能出现精度丢失的问题。
在这里插入图片描述

浮点数间隔

既然我们已经初步了解了精度丢失问题,不妨我们想一下,“这个精度丢失是不是可控的?它会以一个什么样趋势开始丢失精度?这其中有没有规律?”,要解答着这些问题,我们需要了解一些概念,那就是浮点数间隔。浮点数在计算机程序中是有间隔的,这个间隔是指在小数中的某个范围内的两个相邻的小数之间是存在的间隔,我们在计算机中只能存储这间隔之外的小数,无法存储间隔内的小数,例如ÿ

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值