woshixiaobai 发表于 2018-4-16 20:22:49

一个关于dlog算不出来的问题

求路过的大神看一下为什么这样算不出来abc1,是定义的不够合理吗
program main
    implicit real(kind=8)(a-h,o-z)
   
    pi=3.1416926d0
    vm_ini=2.0d0
    abc1=dsqrt(-dlog(rf(0)))
    abc2=2.0d0*pi*rf(0)   
    p=abc1*dsin(abc2)*vm_ini
    end
   
    function rf(idum)         
    implicit real(kind=8)(a-h,o-z)
    save ma,inext,inextp
    parameter (mbig=1000000000,mseed=161803398,mz=0,fac=1.e-9)
    dimension ma(55)
    data iff/0/
    if(idum<0.or.iff==0) then
      iff=1
      mj=mseed-iabs(idum)
      mj=mod(mj,mbig)
      ma(55)=mj
      mk=1
      do 50 i=1,54
            ii=mod(21*i,55)
            ma(ii)=mk
            mk=mj-mk
            if(mk<mz) mk=mk+mbig
            mj=ma(ii)
50      continue
      do 100 k=1,4
            do 60 i=1,55
                ma(i)=ma(i)-ma(1+mod(i+30,55))
                if(ma(i)<mz) ma(i)=ma(i)+mbig
60          continue
100   continue
      inext=0
      inextp=31
    endif
200 inext=inext+1
    if(inext==56) inext=1
    inextp=inextp+1
    if(inextp==56) inextp=1
    mj=ma(inext)-ma(inextp)
    if(mj<mz) mj=mj+mbig
    ma(inext)=mj
    rf=mj*fac
    if(rf>1.e-8.and.rf<0.999999999) return
    goto 200
    pause
    end




吉大渣渣-固体 发表于 2018-4-16 20:22:50

计算不出来是因为您没有写输出语句,无法看到执行结果。

直接加上对应的输出语句即可。But重点来了,您的代码还是有问题的,主要在声明和数据类型上。
1.“ implicit real(kind=8)(a-h,o-z)”这个懒人神句危害很大的,没有声明的以a-h,o-z开头的变量数组都可以在程序中畅通无阻执行,这样写错了个字母很难排查出来且编译器不会报错,其初始化也是问题,有重大安全隐患;强烈建议改implicit none,强迫症保平安;
2.请重视数据类型。
针对以上问题不妨做以下修改:

执行结果:

至于二者为什么执行结果不同,因时间关系,建议您检查初始化和数据类型。祝好!

woshixiaobai 发表于 2018-4-17 10:17:59

吉大渣渣-固体 发表于 2018-4-17 01:07
计算不出来是因为您没有写输出语句,无法看到执行结果。

直接加上对应的输出语句即可。But重点来了,您的 ...

万分感谢!
页: [1]
查看完整版本: 一个关于dlog算不出来的问题