Введение

Алгоритм в численном анализе
В численном анализе алгоритм суммирования Кахана, также известный как компенсированное суммирование, значительно снижает числовую ошибку в итоговой сумме, полученной при сложении последовательности чисел с плавающей точкой конечной точности, по сравнению с наивным подходом. Это достигается за счет ведения отдельной накопительной компенсации (переменной для аккумулирования малых ошибок), что фактически увеличивает точность суммы на точность переменной компенсации. В частности, простое последовательное суммирование чисел имеет максимальную ошибку, растущую пропорционально , и среднеквадратичную ошибку, растущую как для случайных входных данных (ошибки округления образуют случайное блуждание). При использовании компенсированного суммирования, с компенсационной переменной достаточной точности, максимальная ошибка практически не зависит от , поэтому большое количество значений можно суммировать с ошибкой, зависящей только от точности представления результата числами с плавающей точкой. Иво Бабушка, по-видимому, независимо разработал аналогичный алгоритм (отсюда суммирование Кахана — Бабушки). Схожие, более ранние методы включают, например, алгоритм построения линии Брезенхема, отслеживающий накопленную ошибку в целочисленных операциях (хотя впервые был описан примерно в то же время), и дельта-сигма модуляцию.

Альтернативы

Хотя алгоритм Кахана обеспечивает рост ошибки при суммировании n чисел, лишь незначительно больший рост можно достичь с помощью попарного суммирования: рекурсивно разделяют набор чисел на две половины, суммируют каждую половину, а затем складывают полученные две суммы. На практике, при ошибках округления случайного знака, среднеквадратичные ошибки попарного суммирования фактически растут как . Другой метод, использующий только целочисленную арифметику, но требующий большого аккумулятора, был описан Кирхнером и Кулишем; аппаратная реализация этого метода была описана Мюллером, Рубом и Рюллингом.

Поддержка библиотеками

В общем, встроенные функции "sum" в компьютерных языках обычно не гарантируют использование какого-либо конкретного алгоритма суммирования, тем более суммирования Кахана. Стандарт BLAS для подпрограмм линейной алгебры явно избегает предписания какого-либо конкретного порядка вычислений из соображений производительности, и реализации BLAS обычно не используют суммирование Кахана. Стандартная библиотека языка Python определяет функцию `fsum` для точного суммирования. Начиная с Python 3.12, встроенная функция `sum` использует суммирование Ноймайера. В языке Julia реализация функции `sum` по умолчанию использует попарное суммирование для достижения высокой точности при хорошей производительности, однако внешняя библиотека предоставляет реализацию варианта Ноймайера под названием `sum kbn` для случаев, когда требуется ещё более высокая точность. В языке C# пакет NuGet HPCsharp реализует вариант Ноймайера и попарное суммирование: как в скалярном виде, так и в параллельном, с использованием инструкций SIMD процессора и многоядерной обработки.