Ruby: sum vs. inject (: +) дает разные результаты - PullRequest
0 голосов
/ 15 мая 2018

Я заметил, что array.sum и array.inject(:+) дают разные результаты.В чем причина?

a = [10, 1.1, 6.16]

a.inject(:+)
# => 17.259999999999998

a.sum
# => 17.26

1 Ответ

0 голосов
/ 15 мая 2018

Реализация C Array#sum делегирует алгоритму суммирования Кахана , когда некоторые его входные данные являются числами с плавающей запятой.

Этот алгоритм ...

... значительно уменьшает числовую ошибку в сумме, полученную путем добавления последовательности чисел с плавающей запятой конечной точности, по сравнению с очевидным подходом.Это делается путем сохранения отдельной рабочей компенсации (переменная для накопления небольших ошибок).

- Википедия

См. Array # sum и реализация на Github .

...