Я заметил, что array.sum и array.inject(:+) дают разные результаты.В чем причина?
array.sum
array.inject(:+)
a = [10, 1.1, 6.16] a.inject(:+) # => 17.259999999999998 a.sum # => 17.26
Реализация C Array#sum делегирует алгоритму суммирования Кахана , когда некоторые его входные данные являются числами с плавающей запятой.
Array#sum
Этот алгоритм ...
... значительно уменьшает числовую ошибку в сумме, полученную путем добавления последовательности чисел с плавающей запятой конечной точности, по сравнению с очевидным подходом.Это делается путем сохранения отдельной рабочей компенсации (переменная для накопления небольших ошибок). - Википедия
... значительно уменьшает числовую ошибку в сумме, полученную путем добавления последовательности чисел с плавающей запятой конечной точности, по сравнению с очевидным подходом.Это делается путем сохранения отдельной рабочей компенсации (переменная для накопления небольших ошибок).
- Википедия
См. Array # sum и реализация на Github .