我在我的程序中有一個問題。用掩碼調用的內部函數總和會導致可疑的結果:當我執行平均值時,我從數組邊界中獲得一個值。我懷疑這與舍入錯誤有關。我正在處理大數組,並且舍入誤差會導致較大的偏差(與40,000個元素大小的預期值相比,差異約爲40%)。問題與sum(array,mask = ...)
下面是重現它的最小示例以及相關的輸出。
program main
implicit none
integer :: nelem
real, allocatable, dimension(:) :: real_array
logical, allocatable, dimension(:) :: log_array
! init
nelem=40000
allocate(real_array(nelem))
allocate(log_array(nelem))
real_array=0.
log_array=.true.
! Fill arrays
real_array=1./2000.
log_array = real_array.le.(0.5)
! Test
print *, ' test : ', &
count(log_array)+sum(real_array, mask=log_array), &
sum(1.+real_array,mask=log_array)
end program main
輸出繼電器是:
test : 40019.9961 40011.9961
理論成果是40020.
運行GNU的Fortran(GCC)4.9.0
可能重複[浮點數學是否被破壞?](http://stackoverflow.com/questions/588004/is-floating-point-math-broken) –