我在数组(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
当然我的代码比这个大,但我不想让你感到困惑,所以我只向你展示了这一部分。
答案 0 :(得分:2)
经典的舍入错误问题。浮点加法不遵循通常的数学规则。特别是,(a+b)+c = a+(b+c)
不成立。
如果10^-21
对您来说太过错误,请查看Kahan总和。简而言之,它总结了总和中累积的舍入误差。