Почему результаты Silverfrost и Gfortran разные?

Когда я запускаю свой код с помощью Silverfrost fortran, результат -2.987531633638E-02, Но с Gfortran (под Cygwin и Ubuntu Linux) это -2.9875316336381942E-002, Мой код здесь:

program seebeck

real*8::ss
integer::ix,i
complex,parameter::i1=(0.0,1.0)

call quad3d(0.,190.,ss)
write(*,*) "result:",ss
stop
end program seebeck

  SUBROUTINE quad3d(x1,x2,ss)
  REAL:: x1,x2
  external f1
  real*8::ss,f1
  call qgausep(f1,x1,x2,ss)
  return
  END
  SUBROUTINE qgausep(f2,a,b,ss)
  external f2
  REAL:: a,b
  real*8::ss,f2
  INTEGER j
  REAL*8 dx,xm,xr,w(5),x(5)
  SAVE w,x
  DATA w/.2955242247,.2692667193,.2190863625,.1494513491,.0666713443/
  DATA x/.1488743389,.4333953941,.6794095682,.8650633666,.9739065285/
  xm=0.5*(b+a)
  xr=0.5*(b-a)
  ss=0
  do 11 j=1,5
    dx=xr*x(j)
    ss=ss+w(j)*(f2(xm+dx)+f2(xm-dx))
  11    continue
  ss=xr*ss
  return
  END

  function f1(t)
  real*8::t,f1
  f1=cos(t)/(1+exp(t))**2
  end function

Существует огромная разница между двумя результатами. Я не могу объяснить причину этой разницы как неточность с плавающей запятой.

Примечание. Мой код является черновой версией и не имеет физического смысла.

1 ответ

Это как-то связано с тем, как разные компиляторы обрабатывают ваше назначение данных в строке 26/27 вашего кода. Вы определили как w, так и x как массивы двойной точности, но инициализируете их только значениями с более низкой точностью. Это внесет некоторую неточность с плавающей запятой. Фактически, если я передаю ваш код через NAG-компилятор (который, как известно, очень строг), он выдает предупреждение:

Warning: test.f90, line 26: Low-precision data-value assigned to high-precision data-object

Для подтверждения вы можете распечатать значения в массиве w и x, чтобы увидеть, отличаются ли они при использовании разных компиляторов.

Другие вопросы по тегам