回 帖 发 新 帖 刷新版面

主题:急求助高手进!。fortran和matlab的结果有差异

%下面的matlab
LceLL=0.001e0;
  pi=3.1415926535897932e0;
  Tv=1*LceLL;
  Tp=LceLL*0.5;
  Az=2*Tv+Tp;
  Fv=Tv/Az;
  Fp=Tp/Az;
  Gz=2*pi*2/Az; 
  P=(Fv+Fp)*exp(-i*Gz*(Tv+Tp))/(-i*Gz*(Tv+Tp))-(Fv)*exp(-i*Gz*(Tv))/(-i*Gz*(Tv))
!fortran
PROGRAM TEST 
  implicit none
  real*8::Az,Tv,Tp,Fv,Fp,Gz,LceLL=0.001,pi=3.1415926535897932d0
  doublecomplex:: c=(0.0,1.0),P
  Tv=1*LceLL 
  Tp=LceLL*0.5
  Az=2*Tv+Tp
  Fv=Tv/Az
  Fp=Tp/Az
  Gz=2*pi*2/Az 
  P=(Fv+Fp)*cdexp(-c*Gz*(Tv+Tp))/(-c*Gz*(Tv+Tp))-(Fv)*cdexp(-c*Gz*(Tv))/(-c*Gz*(Tv))
  print*,P
END PROGRAM TEST 
下面是P的值
matlab
     P =
1.513653457281314e-001 -3.122502256758253e-017i
fortran
(0.151365345728131,-3.469446951953614E-017)
虚部差异还是比较明显!怎么解决?谢谢

回复列表 (共7个回复)

沙发


自己顶下!

板凳

我怎么在cvf运行你的代码结果是

 (0.151365345728131,-3.122502256758253E-017)
Press any key to continue

跟你matlab的一样的

3 楼

C:\>gfortran b.f90 -o b.exe
C:\>b
 ( 0.15136534572813143     ,-2.91718147034381037E-017)

C:\>ifort b.f90
C:\>b
 (0.151365345728131,-2.775557561562891E-017)

C:\>df b.f90
C:>b
 (0.151365345728131,-3.122502256758253E-017)

4 楼

aliouying兄的认真让我感到汗颜. 我也简单试了一下几个编译器, 结果如下


[me@console Subset_array]$ ifort helptest.f90 
[me@console Subset_array]$ ./a.out
 (0.151365345728131,-3.122502256758253E-017)
[me@console Subset_array]$ ifort -v
Version 11.1 

[me@s0048 ForOutsideFirends]$ ifort helptest.f90
[me@s0048 ForOutsideFirends]$ ./a.out
 (0.151365345728131,-3.122502256758253E-017)
[me@s0048 ForOutsideFirends]$ ifort -v
Version 12.0.2

[me@s0048 ForOutsideFirends]$ gfortran helptest.f90 
[me@s0048 ForOutsideFirends]$ ./a.out
 ( 0.15136534572813143     ,-3.12250225675825277E-017)
gfortran 4.5.2

5 楼

yeg001兄的编译器版本之高让我汗颜。
我的版本测试结果貌似很不准确,有必要更新下编译器了。
我的ivf Version 11.1.060
gfortran Version 4.5.2

6 楼

1 -- 首先,我对楼主的 Fortran 程序书写有些建议,为何不在 Source-Code 中统一用双精度呢?
2 -- 其次,我们必须看到的是问题的关键:虚部是两个相差很小的数想减,导致精度丢失。这必须从算法层面来解决问题,与编译器内部浮点数单元运算是否“正确”关系不大,就是同一个编译器,是否优化,对结果有很大影响,不如 Debug 版本和 Release 版本。

program test 
  implicit none
  real(kind = 8):: az, tv, tp, fv, fp, gz
  real(kind = 8):: lcell = 0.001d0, pi = 3.1415926535897932d0
  complex(kind = 8):: c
  complex(kind = 8):: p
  c = cmplx(0.0d0, 1.0d0, 8)
  tv=1.0d0 * lcell 
  tp=lcell * 0.5d0
  az=2.0d0*tv+tp
  fv=tv/az
  fp=tp/az
  gz=2.0d0*pi*2.0d0/az 
  p=(fv+fp)*exp(-c*gz*(tv+tp))/(-c*gz*(tv+tp))
  write(*, *) p  

  p = (fv)*exp(-c*gz*(tv))/(-c*gz*(tv))
  write(*, *) p
  stop
end program test

7 楼


非常感谢您的指导!

我来回复

您尚未登录,请登录后再回复。点此登录或注册