FE.ES-闭幕0.1+0.2,答到点上的那种

随意逛了一下知乎和思否的博文,多数没回复到点上。

I.浮点数的二进制存储

采纳 IEEE 754 范例来存储浮点数:
1位【正负标记】+11位【指数】+52位【有用数字】,如下图
《FE.ES-闭幕0.1+0.2,答到点上的那种》

因为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…

    原文作者:seasonley
    原文地址: https://segmentfault.com/a/1190000018314698
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞