У меня проблема в моей программе. Внутренняя сумма функций, вызванная с помощью маски, приводит к подозрительным результатам: когда я выполняю среднее значение, я получаю значение из границ массива. Я подозреваю, что это связано с ошибками округления. Я работаю с большими массивами, и ошибки округления приводят к большим отклонениям (разница примерно на 40% по сравнению с ожидаемым значением в размере 40 000 элементов).Проблема с суммой (массив, маска = ...)
Ниже приведен минимальный пример для его воспроизведения и связанный с ним выход.
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
Ouput является:
test : 40019.9961 40011.9961
теоретических результатов 40020.
Запуск GNU Fortran (GCC) 4.9.0
Возможный дубликат [Является ли математика с плавающей запятой?] (Http://stackoverflow.com/questions/588004/is-floating-point-math-broken) –