【Fortran,MFiX】Fortran语言浮点数 双精度数 数值精度和下溢问题

问题

Fortran中的浮点数,默认是单精度数,也就是6-7位的精度。双精度数有15位
注意,只要你写的是2.0,1.0之类的数字,就默认是单精度,并且不会强制类型转换

什么意思呢?
看这样一个例子

program try
implicit none
double precision E_i,R,e,e2,e3
E_i=1.2e8
R=8314
write (*,*) "a=", E_i
write (*,*) "b=", R
write (*,*) "1.2e8/8314=", E_i/R

e=exp(-E_i/(8.3147295*1093.0))
write (*,*) "e=", e

e2=exp(-1.2e5/(8.3147295*1093.0))
write (*,*) "e2=", e2

e3=exp(-1.2d8/(8314.7295d0*1093d0))
write (*,*) "e3=", e3

end program

gfortran编译,输出结果是
在这里插入图片描述
这里就看出端倪了,e的结果是0

计算机先算E_i/(8.3147295*1093.0)
再算exp

第一步计算的时候,数值已经下溢了。造成结果为0

此外我们看到,e2与e3的结果也是有轻微差别的

e2是一种折中的方法,先手动把大的数字约分掉,让数值不下溢

解决方案

很简单
在所有使用字面浮点数的场合加上d0
比如1/2使用1d0/2d0
8.314使用8.314d0

原文地址:https://www.cnblogs.com/chunleili/p/12758183.html