我有一個輸入文件,第一行包含以下小數。從文件讀取的值在Fortran中存儲爲不同的值
0.5053102074297753
我有一個Fortran 90程序讀取文件並輸出值。
read(*,*) answer
write(*,"(F20.16)") answer
這是輸出:
0.5053101778030396
顯然,其存儲的是不一樣的東西被讀取。問題是,爲什麼?
我有一個輸入文件,第一行包含以下小數。從文件讀取的值在Fortran中存儲爲不同的值
0.5053102074297753
我有一個Fortran 90程序讀取文件並輸出值。
read(*,*) answer
write(*,"(F20.16)") answer
這是輸出:
0.5053101778030396
顯然,其存儲的是不一樣的東西被讀取。問題是,爲什麼?
如何聲明答案?如果它是單精度實數,則只能預期大約6位精度的十進制數字。
此外,值被轉換爲二進制的內部存儲和計算。這可能會導致四捨五入和其他問題,但這裏的差別太大了,因爲這是原因。
要聲明的答案,雙精度,使用以下命令:
integer, parameter :: DRK = selected_real_kind (14)
real (kind=DRK) :: answer
這將保證答案至少有14張十進制數。 「DRK」可以在整個程序中使用。根據你的編譯器,你可以嘗試要求更多的數字......它可以提供這樣一種類型。很少有超過雙倍精度的必要。
What Every Computer Scientist Should Know About Floating-Point Arithmetic。
默認實際精度不足以在小數部分存儲小數點後16位的數字。
就是這樣!我完全忘了精度。答案被定義爲真實(kind = 4)。非常感謝。 – blahbaa 2010-09-24 16:25:58