fre*_*low 8 c++ floating-point rounding-error sum ieee-754
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
Run Code Online (Sandbox Code Playgroud)
是否有一个特定的原因,它使用减法(而不是添加)?如果我在计算中交换操作数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
Run Code Online (Sandbox Code Playgroud)
或者浮点加法和减法之间是否有一些奇怪的区别我还不知道呢?
此外,原始算法之间(t - sum) - y和之间有什么区别t - sum - y吗?括号不是多余的,因为它-是左关联的,无论如何?
据我所知,您的方法与维基百科中的方法完全相同。唯一的区别是 的符号c——以及它的含义——被颠倒了。在维基百科算法中,c是总和的“错误”部分;c=0.0001 意味着总和比应有的要大一些。在您的版本中,c是对总和的“修正”;c=-0.0001 表示总和应该稍微小一些。
我认为括号是为了可读性。它们是为我们服务的,而不是为机器服务的。
| 归档时间: |
|
| 查看次数: |
882 次 |
| 最近记录: |