gpt4 book ai didi

ruby - Enumerable#sum 如何避免浮点舍入错误?

转载 作者:数据小太阳 更新时间:2023-10-29 07:19:39 25 4
gpt4 key购买 nike

我在 Ruby 中玩一些浮点舍入错误的玩具示例,我注意到以下行为让我感到惊讶。

首先,一个不足为奇的例子,发生舍入错误的地方:

numbers = Array.new(10, 0.1)
#=> [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]

numbers.inject(0, :+)
#=> 0.9999999999999999

现在尝试用 Enumerable#sum 做同样的事情:

numbers.sum
#=> 1.0

我在文档中唯一能找到的暗示解释的是

sum method may not respect method redefinition of “+” methods such as Integer#+.

所以我想有某种本地代码实现可以加快速度,但我认为 C float 也受制于 IEEE-754 相关的不精确算法。

第二个例子中的行为的原因是什么? sum 方法如何避免舍入误差?

最佳答案

Amadancomment 中给出了答案.

对于浮点值,Enumerable#sum 使用一种算法来补偿求和过程中的误差累积。

如评论中所述,源代码链接到 this paper维基百科上有一篇关于所描述算法变体的文章,称为 Kahan Summation Algorithm .

关于ruby - Enumerable#sum 如何避免浮点舍入错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57394493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com