【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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM