c++ - Kahan算法中的加法而不是减法

标签 c++ floating-point sum ieee-754 rounding-error

这是 Kahan summation algorithm from Wikipedia :

function KahanSum(input)
    var sum = 0.0
    var c = 0.0
    for i = 1 to input.length do
        y = input[i] - c    // why subtraction?
        t = sum + y
        c = (t - sum) - y
        sum = t
    return sum

它使用减法(而不是加法)是否有特定原因?如果我在 c 的计算中交换操作数,我可以使用加法代替吗?不知何故,这对我来说更有意义:

function KahanSum(input)
    var sum = 0.0
    var c = 0.0
    for i = 1 to input.length do
        y = input[i] + c    // addition instead of subtraction
        t = sum + y
        c = y - (t - sum)   // swapped operands
        sum = t
    return sum

或者我还不知道浮点加法和减法之间有什么奇怪的区别?

还有,原算法中的(t - sum) - yt - sum - y有什么区别吗?括号不是多余的吗,因为 - 无论如何都是左关联的?

最佳答案

据我所知,您的方法与维基百科中的方法完全相同。唯一的区别是 c 的符号——以及它的含义——被颠倒了。在维基百科算法中,c 是求和的“错误”部分; c=0.0001 表示总和比应有的大一点。在您的版本中,c 是对总和的“更正”; c=-0.0001 表示总和要小一点。

而且我认为括号是为了便于阅读。它们适用于我们,而不适用于机器。

关于c++ - Kahan算法中的加法而不是减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8446857/

相关文章:

android - 求和查询 SQLite 中获取重复值的问题

mysql - SUM 情况返回值而不使用 GROUP BY

c++ - 如何防止大于视口(viewport)的 Texture_2D 被缩放到 openGL 中的视口(viewport)

c++ - 概念可能会取代 C++ 中的类型特征吗?

floating-point - 为什么 float 不正确?

python - Python 中的机器 Epsilon

c++ - 如何在类,c++中使用带参数的函数?

java - JNI CallStaticObjectMethod 在 C++ 中返回 NULL

c++ - 是否有支持 g++ 或 clang 内存驻留编译的实用程序?

python - 无法将数组转换为 float python