在DO循环中执行求和时Fortran浮动错误?

时间:2015-01-30 16:44:27

标签: floating-point sum double-precision

我在数组(n)中有四个双精度实数(n1,n2,n3和n4)。

当我计算这四个数字的总和时,奇怪的是 一个DO循环然后直接计算总和我没有得到相同的确切数字!

请注意,我正在更改数字的顺序。例如,在Do循环期间,我转到n1 + n2 + n3 + n4,但在直接和中,我转到n1 + n3 + n2 + n4。两者都应该给出相同的数字,但是当我减去两个结果时我得不到零,而是得到一个非常小的数字(x10 ^ -21)!

这是我的代码:

PROGRAM SumFourNo
REAL(KIND=DP) :: n(4), n_sum
INTEGER       :: i

n(1) = 9.259259259259259E-006
n(2) = 4.629629629629630E-006
n(3) = 9.259259259259259E-006
n(4) = 4.629629629629630E-006
n_sum = 0.0_DP

DO i = 1 , 4
    n_sum = n_sum + n(i)
ENDDO

WRITE(*,*) 'Check =', (n(1)+n(3)+n(2)+n(4)) - n_sum

ENDPROGRAM SumFourNo

当然我的代码比这个大,但我不想让你感到困惑,所以我只向你展示了这一部分。

1 个答案:

答案 0 :(得分:2)

经典的舍入错误问题。浮点加法不遵循通常的数学规则。特别是,(a+b)+c = a+(b+c)不成立。

如果10^-21对您来说太过错误,请查看Kahan总和。简而言之,它总结了总和中累积的舍入误差。