Ваша проблема, по сути, связана с другим вопросом . Тем не менее, полезно добавить некоторые комментарии к Фортрану.
Как и в этом другом вопросе, дискретный характер чисел с плавающей точкой означает, что существует точка, в которой одно число слишком мало, чтобы иметь значение при добавлении к другому. В случае этого вопроса:
if (1e4+1e-4==1e4) print *, "Oh?"
if (1d4+1d-4==1d4) print *, "Really?"
end
То есть вы можете использовать реалы двойной точности, и проблема исчезнет.
Какое наименьшее число можно добавить к 1e4
, чтобы получить что-то отличное от 1e4
(или * 1d4
)?
print *, 1e4 + SPACING(1e4), 1e4+SPACING(1e4)/2
print *, 1d4 + SPACING(1d4), 1d4+SPACING(1d4)/2
end
Этот интервал зависит от размера числа. Для больших чисел он большой, а около 1 - маленький.
print*, EPSILON(1e0), SPACING([(1e2**i,i=0,5)])
print*, EPSILON(1d0), SPACING([(1d2**i,i=0,5)])
end