资讯专栏INFORMATION COLUMN

FE.ES-终结0.1+0.2,答到点上的那种

qylost / 640人阅读

摘要:随便逛了一下知乎和思否的博文,大都没回答到点上。当比较和时,实际比较的是转成进制,看上去是结果很明显啦参考资料

随便逛了一下知乎和思否的博文,大都没回答到点上。

I.浮点数的二进制存储

采用 IEEE 754 规范来存储浮点数:
1位【正负符号】+11位【指数】+52位【有效数字】,如下图

由于0.1.toString(2)=0.0001100110011001100110011001100110011001100110011001101
所以
0.1 = 2^-4 * [1].1001100110011001100110011001100110011001100110011010
0.2 = 2^-3 * [1].1001100110011001100110011001100110011001100110011010

II. 到底怎么相加

铁律是52位有效数字,也就是:

0.1 = 2^-3 *  0.1100110011001100110011001100110011001100110011001101(0)
0.2 = 2^-3 *  1.1001100110011001100110011001100110011001100110011010
sum = 2^-2 * 1.0011001100110011001100110011001100110011001100110011(1)

由于有效数字变成了53位,根据IEEE754 rounding mode 的 Round to Nearest,若x在a和b之间,选择最低有效位为零的值

a = 2^-2 * 1.0011001100110011001100110011001100110011001100110011
x = 2^-2 * 1.0011001100110011001100110011001100110011001100110011(1)
b = 2^-2 * 1.0011001100110011001100110011001100110011001100110100

当比较0.1+0.2 和 0.3时,实际比较的是

0.1 + 0.2 => 0:01111111101:0011001100110011001100110011001100110011001100110[100]
0.3       => 0:01111111101:0011001100110011001100110011001100110011001100110[011]

转成10进制,看上去是:

0.1 + 0.2 => 0.300000000000000044408920985006...
0.3       => 0.299999999999999988897769753748...

结果很明显啦

参考资料:
https://stackoverflow.com/que...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/102151.html

相关文章

  • 2019面试笔记

    摘要:使用构造函数创建对象后,新对象与构造函数没有关系了,新对象的属性指向的是构造函数的原型对象。构造继承使用父类的构造函数来增强子类的实例,等于是在子类的构造函数内部执行。 一.js原始类型: 在js中,存在着6种原始值: * boolean * number * string * undefined * null * symbol 注意: 虽然typeof null输出的是o...

    nidaye 评论0 收藏0
  • 深度剖析0.1 +0.2===0.30000000000000004的原因

    摘要:吐槽一句,大二的专业课数字逻辑电路终于用在工作上了。,整数位为,且精度只到十分位,因此是。如果是不限精度的话,转换后的二进制数应该是无限循环。再看一下百科给出的标准因此,的类型,最高的位是符号位,接着的位是指数,剩下的位为有效数字。 showImg(https://segmentfault.com/img/remote/1460000011902479?w=600&h=600); 用一...

    haobowd 评论0 收藏0
  • numpy数组维度理解终结

    摘要:写在前面可能你会不相信,我是从玩中过来的,我觉得有必要记录一下,这个坑还非踩不可为了说的清楚一点儿,我多铺垫一点儿,先说说数组维度的理解引子老铁们猜一猜长啥样我猜你还没到点我到底想说啥,还是一头雾水,对吧哈哈别揍我,关子卖的挺大,我到底想说 写在前面 可能你会不相信,我是从玩pytorch中过来的,我觉得有必要记录一下,transpose这个坑还非踩不可,为了说的清楚一点儿,我多铺垫一...

    LeexMuller 评论0 收藏0
  • 译文-G1收集器

    摘要:原文出处设计的一个重要目标是设置阶段的持续时长和频率,因为垃圾收集器可预测,可配置。收集器尽自己最大努力高概率实现目标但不是必然,它会是硬实时。因此名称是收集器。运行不同使用独立的收集器。 原文出处:G1 – Garbage First G1设计的一个重要目标是设置stop-the-world阶段的持续时长和频率,因为垃圾收集器可预测,可配置。事实上,G1是一款软实时的收集器,意味着你...

    missonce 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<