Есть большой и длинный код, а в нем фрагмент:
function conv_check_2() result(diff_max)
use globals
implicit none
real(8) diff_max
real(8) :: diff, t1, t2, t3, t4
do i=2, nx-1
t1 = -get_n1(i, I_tilde(i))*A_emission
t2 = I_tilde(i)*(get_n0(i, I_tilde(i))*B01 - get_n1(i, I_tilde(i))*B10)
t3 = V01(i)*get_n0(i, I_tilde(i))*v_dens_e(i)
t4 = -V10(i)*get_n1(i, I_tilde(i))*v_dens_e(i)
diff = t1 +t2 + t3 + t4
write(*, '(5es16.8e3)') t1, t2, t3, t4, diff
<...>
Последняя строчка выдает следующее: -4.47171865E+010 4.45362655E+010 1.80922022E+008 -1.04464889E+003 7.98239194E-006
То есть сумма намного меньше одного. Если те же самые числа сложить отдельно, используя тот же компилятор, то в сумме получается 6.51351074E+002. Что, ясное дело, и есть правильный ответ. Проверял gdb, действительно t1, t2, t3, t4 равны тому, чему и должны быть равны, а сумма их и вправду меньше одного. Как такое в принципе возможно? Почему одна и та же сумма, посчитанная в разных местах, равна разным числам? Я уже даже не представляю, куда смотреть в поисках ошибки.