Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么silverfrost和gfortran的结果不同?_Fortran_Silverfrost Fortran - Fatal编程技术网

为什么silverfrost和gfortran的结果不同?

为什么silverfrost和gfortran的结果不同?,fortran,silverfrost-fortran,Fortran,Silverfrost Fortran,当我使用Silverfrost fortran运行代码时,结果是-2.987531633638E-02。但对于gfortran(在cygwin和UbuntuLinux下),它是-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

当我使用Silverfrost fortran运行代码时,结果是
-2.987531633638E-02
。但对于gfortran(在cygwin和UbuntuLinux下),它是
-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
这两个结果之间存在巨大差异。我无法将这种差异的原因解释为浮点不准确


注意:我的代码是草稿版本,没有物理意义

这与不同的编译器如何处理代码第26/27行的数据分配有关。您将w和x都定义为双精度数组,但仅使用较低的精度值初始化它们。这将引入一些浮点精度。事实上,如果我通过NAG编译器(已知非常严格)传递您的代码,它会给出一个警告:

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

为了确认,您可以打印出数组w和x中的值,看看它们在使用不同的编译器时是否不同。

差异很大吗?结果保留小数点后12位。区别很可能来自使用列表定向输出——编译器可以自由选择它认为合适的任何格式。给出一个明确的格式并固定编辑描述符中的小数位数,然后比较结果并声称它们是不同的。你所说的“巨大差异”是什么意思?在我看来,您的输出似乎符合它们的共同精度。如果您使用与您当前从gfortran获得的输出相匹配的显式格式,而不是让每个编译器任意选择自己的格式,该怎么办?例如,请尝试使用
write(*,“(a,es30.20)”
而不是
write(*,*)
来输出
ss
。前一种方式(显式格式)打印更多的数字。这(和一堆其他低精度的文字)应该是固定的,但我希望两个编译器以相同的方式处理转换。