Андрей
Высший разум
(481660)
1 неделю назад
Потому, что вещественные вычисления - это ВСЕГДА погрешность. И при стандартной точности представления мантиссы 15-17 значащих десятичных разрядов значение -0.0000000000000568434... - это и есть погрешность вычислений в чистом виде.
P.S. Если ты в своём суммировании будешь переставлять числа местами, есть достаточно высокая вероятность получить разный результат - именно в силу погрешности вычислений.
Svat FaradyМастер (2113)
1 неделю назад
Да, но погрешность непростительна велика и составляет -5,684... Я бы понял, если бы где-то возникла проблема в подсчете десятичной части, но возникает ошибка даже в целой части.
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 без плавающих погрешностей.
Первая строка в output - ручной подсчет, а вторая - через sum
Почему между ручным подсчетом и sum получаются два разных результата? (0 - правильный)
Выше нигде sum в качестве переменной не используется*