問題
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