Enumerable#sum
ruby 2.4
で入るらしいEnumerable#sum
ですが、最初見たときは「あぁ、そういうのも追加されるのか」というぐらいだったのですが、
で、
特定の場合(浮動小数点数の配列とか)には誤差が累積しないアルゴリズムが採用されています
と紹介されていたので、「お?」と思って試してみました。
まず普通に足し算
% ruby -ve 'p ([0.1] * 10).inject(:+)'
ruby 2.4.0preview2 (2016-09-09 trunk 56129) [x86_64-darwin15]
0.9999999999999999
浮動小数点での誤差が正しく(?)でてますね。
次にsum
で足し算
% ruby -ve 'p ([0.1] * 10).sum'
ruby 2.4.0preview2 (2016-09-09 trunk 56129) [x86_64-darwin15]
1.0
おお! ・・・と思ったら、
によると、
% ruby -ve 'p ([0.1] * 3).sum'
ruby 2.4.0preview2 (2016-09-09 trunk 56129) [x86_64-darwin15]
0.30000000000000004
というケースもあるんですね。