TGViewer
Classical Vlad Classical Vlad @classical_vlad · 457 subscribers
Post #17 1.26K
Kahan summation

Иногда можно встретиться с проблемой при суммировании большого количества чисел с плавающей точкой. Особенно если числа разных порядков, эта ошибка может быть значительной для нашей дальнейшей логики.

Корень проблемы лежит в представлении чисел в памяти. По стандарту IEEE 754 число с плавающей точкой представляется знаком, экспонентой и мантиссой. Со знаком всё понятно (отрицательное или положительное число), экспонента, грубо говоря, показывает, где ставить точку в числе, мантисса представляет собой значащие цифры числа.

При обычном суммировании может не хватить точности мантиссы (при fp32 она занимает 24 бита).
Простой пример:

a = np.array([1e8, 1.0, 1.0, -1e8], dtype=np.float32)
print(np.sum(a))

Выведет: 0.0
на единички не хватило 24 бит, потому что log_2(10**8) — это примерно 26.5

Тут на помощь приходит Kahan Algorithm:
def kahan_sum(arr):
total = np.float32(0.0)
compensation = np.float32(0.0)

for val in arr:
y = val - compensation
new_sum = total + y
compensation = (new_sum - total) - y
total = new_sum

return total

После этого сумма будет правильной: 2.0

Почему это работает?
При обычном сложении ошибка округления теряется безвозвратно.
Алгоритм Кахана же сохраняет эту ошибку в переменной compensation и вычитает её на следующем шаге.
  • 🔥 4
  • 👍 1
  • 😈 1
More from @classical_vlad
  1. Aug 25, 2026Буквально лучший поиск, один из самых быстрых дешвле соседей и с тем же качеством keenable…
  2. Aug 16, 2026Итак, мне исполнилось 19 лет. Это был насыщенный год: первый год в эмиграции, первое уволь…
  3. Aug 16, 2026Про Сеул: Первые впечатления: очень жарко и очень влажно. 30-35 градусов, которые ощущаютс…
  4. Aug 3, 2026Раньше я считал, что соревнования не для меня. Я понимал, что всегда найдётся много людей…
  5. Jul 25, 2026Вб сгорел, озон в плену, хованский умер, а мы выпустили быстрый диффузионный апскейлер. Ск…
  6. Jul 18, 2026Я очень много пишу код с помощью Claude Code. Точнее сказать, что иначе я уже не пишу код…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →