Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Python неправильно считает sum

Svat Farady Мастер (2113), закрыт 1 неделю назад
Есть список с числами.
Первая строка в output - ручной подсчет, а вторая - через sum
Почему между ручным подсчетом и sum получаются два разных результата? (0 - правильный)
Выше нигде sum в качестве переменной не используется*
Лучший ответ
Андрей Высший разум (481660) 1 неделю назад
Потому, что вещественные вычисления - это ВСЕГДА погрешность. И при стандартной точности представления мантиссы 15-17 значащих десятичных разрядов значение -0.0000000000000568434... - это и есть погрешность вычислений в чистом виде.

P.S. Если ты в своём суммировании будешь переставлять числа местами, есть достаточно высокая вероятность получить разный результат - именно в силу погрешности вычислений.
Svat FaradyМастер (2113) 1 неделю назад
Да, но погрешность непростительна велика и составляет -5,684... Я бы понял, если бы где-то возникла проблема в подсчете десятичной части, но возникает ошибка даже в целой части.
Андрей Высший разум (481660) Svat Farady, Повторю ещё раз: погрешность НЕ -5,684, а -5,684∙10⁻¹⁴ = -0,00000000000005684. e-14 в записи числа - это и есть "умножить на 10 в степени -14".
Svat FaradyМастер (2113) 1 неделю назад
более того, в другой части кода есть аналогичное использование sum(название списка*), и там все считается верно.
Остальные ответы
Zhy Просветленный (21099) 1 неделю назад
Чат ГПТ ответил так:
==========================
Разница между результатами ручного подсчёта и sum(a) возникает из-за накопления ошибок округления при работе с числами с плавающей точкой (float) в Python.

Что происходит:
В ручной строке print(-45.4104... + (-511.2008...) + ...) все операции выполняются последовательно, слева направо. При этом ошибки округления накапливаются в одном порядке.

В sum(a) используется оптимизированный алгоритм, но всё равно плавающая точка работает не идеально точно: порядок сложения может отличаться, а значит — и итоговая ошибка тоже отличается.

Почему это важно:
Числа с плавающей точкой не могут точно представить все значения. Например, 0.1 + 0.2 != 0.3 в Python — классика таких ситуаций.

Как решить или проверить:
Если хочешь точное сравнение с учётом погрешности, используй math.isclose():

python

import math
print(math.isclose(sum(a), 0.0, abs_tol=1e-10)) # True, если сумма близка к нулю

Или, если нужна точная арифметика — можно использовать decimal.Decimal, но это замедляет расчёты:

python
from decimal import Decimal
a = [Decimal('-45.4104...'), ...]

Вот пример, как переписать твой код с использованием decimal.Decimal, чтобы получить точную арифметику и избавиться от ошибок округления:

python

from decimal import Decimal

a = [
Decimal("-45.41040000000207"),
Decimal("-511.200899999983"),
Decimal("-446.75819999977335"),
Decimal("225.93899999975022"),
Decimal("777.4305000000268")
]

# Ручной подсчет с Decimal
manual_sum = (
Decimal("-45.41040000000207")
+ Decimal("-511.200899999983")
+ Decimal("-446.75819999977335")
+ Decimal("225.93899999975022")
+ Decimal("777.4305000000268")
)

print("Ручной подсчёт с Decimal:", manual_sum)
print("Сумма через sum():", sum(a))

Результат:
Обе суммы теперь будут абсолютно одинаковы и точно равны 0.0 без плавающих погрешностей.
Похожие вопросы