Fortran Coder

查看: 14075|回复: 2
打印 上一主题 下一主题

[数值问题] 一个关于dlog算不出来的问题

[复制链接]

6

帖子

2

主题

0

精华

入门

F 币
31 元
贡献
21 点
跳转到指定楼层
#
发表于 2018-4-16 20:22:49 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
5F 币
求路过的大神看一下为什么这样算不出来abc1,是定义的不够合理吗
[Fortran] 纯文本查看 复制代码
01program main
02    implicit real(kind=8)(a-h,o-z)
03     
04    pi=3.1416926d0
05    vm_ini=2.0d0
06    abc1=dsqrt(-dlog(rf(0)))
07    abc2=2.0d0*pi*rf(0)  
08    p=abc1*dsin(abc2)*vm_ini
09    end
10     
11    function rf(idum)          
12    implicit real(kind=8)(a-h,o-z)
13    save ma,inext,inextp
14    parameter (mbig=1000000000,mseed=161803398,mz=0,fac=1.e-9)
15    dimension ma(55)
16    data iff/0/
17    if(idum<0.or.iff==0) then
18        iff=1
19        mj=mseed-iabs(idum)
20        mj=mod(mj,mbig)
21        ma(55)=mj
22        mk=1
23        do 50 i=1,54
24            ii=mod(21*i,55)
25            ma(ii)=mk
26            mk=mj-mk
27            if(mk<mz) mk=mk+mbig
28            mj=ma(ii)
2950      continue
30        do 100 k=1,4
31            do 60 i=1,55
32                ma(i)=ma(i)-ma(1+mod(i+30,55))
33                if(ma(i)<mz) ma(i)=ma(i)+mbig
3460          continue
35100     continue
36        inext=0
37        inextp=31
38    endif
39200 inext=inext+1
40    if(inext==56) inext=1
41    inextp=inextp+1
42    if(inextp==56) inextp=1
43    mj=ma(inext)-ma(inextp)
44    if(mj<mz) mj=mj+mbig
45    ma(inext)=mj
46    rf=mj*fac
47    if(rf>1.e-8.and.rf<0.999999999) return
48    goto 200
49    pause
50    end





最佳答案

查看完整内容

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

6

帖子

2

主题

0

精华

入门

F 币
31 元
贡献
21 点
沙发
 楼主| 发表于 2018-4-17 10:17:59 | 只看该作者
吉大渣渣-固体 发表于 2018-4-17 01:07
计算不出来是因为您没有写输出语句,无法看到执行结果。

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

万分感谢!
回复

使用道具 举报

27

帖子

0

主题

0

精华

熟手

F 币
212 元
贡献
101 点
楼主
发表于 2018-4-16 20:22:50 | 只看该作者
计算不出来是因为您没有写输出语句,无法看到执行结果。

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

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

使用道具 举报

您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2025-4-24 12:53

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

快速回复 返回顶部 返回列表