Ruby 可枚举总和如何避免浮点舍入错误?

Ruby 可枚举总和如何避免浮点舍入错误?,ruby,algorithm,floating-point,ieee-754,enumerable,Ruby,Algorithm,Floating Point,Ieee 754,Enumerable,我正在玩一些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 现在用可枚举的#sum试试同样的方法: numbers.sum #=> 1.0 我能在文档中找

我正在玩一些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
现在用
可枚举的#sum
试试同样的方法:

numbers.sum
#=> 1.0
我能在文档中找到的唯一能暗示解释的东西是

sum方法可能不考虑“+”方法的方法重新定义,例如Integer#+

因此,我假设有某种本地代码实现可以加快速度,但我假设C浮点也受IEEE-754相关的不精确算法的影响

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

给出了一个简单的答案

对于浮点值
可枚举#sum
使用一种算法,随着求和过程的进行,该算法可以补偿误差的累积


如评论中所述,源代码链接到,维基百科有一篇文章介绍了所述算法的一种变体,即。

指向中的注释,这解释了为什么
sum
更准确。这一定是答案。非常感谢。试图寻找这个词使我找到了一个能很好地解释一般原理的词。