24小时热门版块排行榜    

查看: 462  |  回复: 9
当前主题已经存档。

gongxd325

至尊木虫 (文坛精英)

[交流] 【求助】一句Fortran语句出错问题(已解决)

编个小程序计算指前因子和速率常数,有个语句出错,向大家请教(kB/h=0..20827*10**11)
      A=0.20827*298.15*EXP(2-13.288/8.314)*10**11
程序计算结果是 0.113E+12,正确的结果应该是 9.28E+12
假如只计算 0.20827*298.15*EXP(2-13.288/8.314) 得到 92.8,乘以10**11结果就正确。
想不明白,不知道为什么?

[ Last edited by cadick on 2009-12-14 at 02:53 ]
回复此楼
一个人做点好事并不难难的是一辈子做好事!!!
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)


小木虫(金币+0.5):给个红包,谢谢回帖交流
CODE:
A=0.20827*298.15*EXP(2-13.288/8.314)*10.0**11

其实改动很小,就是将 10 改成 10.0。如果不改的话,gfortran -Wall 会给出如下提示:
CODE:
      A=0.20827*298.15*EXP(2-13.288/8.314)*10**11
                                            1
Error: Arithmetic overflow at (1)

[ Last edited by snoopyzhao on 2009-6-1 at 11:26 ]
2楼2009-06-01 11:24:17
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

gongxd325

至尊木虫 (文坛精英)

谢谢!
Compaq Visul Fortran不报错,但结果错误,搞了半天。
一个人做点好事并不难难的是一辈子做好事!!!
3楼2009-06-01 11:42:27
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

tjpm

金虫 (正式写手)

★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖交流
q68(金币+2,VIP+0):多多指教! 6-1 18:32
你这样写程序会有问题的
建议改一下
A=0.20827d0*298.15d0*EXP(2.0d0-13.288d0/8.314d0)*10.0d0**11

如果是real*16的 就改d0成q0.
引用回帖:
Originally posted by gongxd325 at 2009-6-1 11:13:
编个小程序计算指前因子和速率常数,有个语句出错,向大家请教(kB/h=0..20827*10**11)
      A=0.20827*298.15*EXP(2-13.288/8.314)*10**11
程序计算结果是 0.113E+12,正确的结果应该是 9.28E+12
假如只计算  ...

4楼2009-06-01 16:37:28
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dlbrians

木虫 (著名写手)


小木虫(金币+0.5):给个红包,谢谢回帖交流
是不是算符的优先级问题?多加个括号试试看啊。
5楼2009-06-01 20:17:32
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

gongxd325

至尊木虫 (文坛精英)

谢谢诸位,问题解决了,主要问题就是二楼snoopyzhao指出的,10改为10.0就行了。
一个人做点好事并不难难的是一辈子做好事!!!
6楼2009-06-01 20:30:33
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

tjpm

金虫 (正式写手)


小木虫(金币+0.5):给个红包,谢谢回帖交流
和那些没有关系
就是我上面说的那个原因。
你可以测试一下。
引用回帖:
Originally posted by dlbrians at 2009-6-1 20:17:
是不是算符的优先级问题?多加个括号试试看啊。

7楼2009-06-01 20:36:51
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

tjpm

金虫 (正式写手)

有兴趣的大家可以试试这个

program xxx
real*8 i
i=0.1
write(*,*) "i=",i
end program xxx

使用gfortran和ifort都是
输出i=0.00000001490116

[ Last edited by tjpm on 2009-6-1 at 20:56 ]
8楼2009-06-01 20:54:27
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)


小木虫(金币+0.5):给个红包,谢谢回帖交流
引用回帖:
Originally posted by tjpm at 2009-6-1 20:54:
有兴趣的大家可以试试这个

program xxx
real*8 i
i=0.1
write(*,*) "i=",i
end program xxx

使用gfortran和ifort都是
输出i=0.00000001490116

[ Last edited by tjpm on 2009-6-1 at 20 ...

你就是用 i=0.1d0 得到的结果也不可能恰好等于 0.1 啊……
9楼2009-06-01 22:45:04
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

tjpm

金虫 (正式写手)

★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖交流
q68(金币+2,VIP+0):有意思的程序 6-2 08:22
确实如你所说,0.1 转换成二进制时肯定有误差。
program xxx
real*8 di,dj
real*16 qi,qj
di=0.1
dj=0.1d0
qi=0.1
q1=0.1q0
write(*,*) "di=",di
write(*,*) "dj=",dj
write(*,*) "qi=",qi
write(*,*) "qj=",qj
end program xxx

执行结果:

di=  0.100000001490116     
dj=  0.100000000000000     
qi=  0.100000001490116119384765625000000      
qj=  0.000000000000000000000000000000000E+0000

如果不指定的话,默认是保存为real*4的,所以就出现这样的情况,因为LZ的10是取了10次方的,误差被放大了而已
引用回帖:
Originally posted by snoopyzhao at 2009-6-1 22:45:


你就是用 i=0.1d0 得到的结果也不可能恰好等于 0.1 啊……

10楼2009-06-02 00:08:57
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 gongxd325 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见