熊言熊语

思考问题的熊

马上订阅 熊言熊语 RSS 更新: https://kaopubear.top/blog/atom.xml

眼见不为实:为什么29不等于29

2019年12月19日 19:06

浮点数计算和比较的坑

29 怎么会不等于 29

今天有一个小伙伴给我发来了一个截图如下。我下意识的说了一句:0.58*50 不等于 29。

感概,有时候,眼见也不一定为实。这就是一个浮点运算导致的「算不准」问题。

在历史上,其实已经有过类似因为浮点运算导致的事故。

1994 年,英特尔的奔腾微处理器芯片的浮点计算单元出现了一个 Bug。在某些情况下,浮点除法并不能返回正确的结果。例如 4195835.0/3145727.0 产生的是 1.33374 而不是 1.33382。虽然这个 Bug 可能对绝大多数人没有影响,但是市面上 500 万左右流通的芯片都存在该缺陷,随着整个事件的发酵,最终这个 Bug 给 intel 造成了 4.75 亿美元的损失。这次事件也被称为「Pentium FDIV bug」而载入了 Bug 史册。

R 语言中的实际示例

我们分别在 R 中计算 0.58*50,0.29*100,然后让他们和 29 互相比一比。

(a=29)
(b=0.58*50)
(c=0.29*100)
a==c
a==b
b==c

结果如下所示:

>...

剩余内容已隐藏

查看完整文章以阅读更多