2017-01-19 17 views
0

誰かが、特にテキストファイルからFortranがどのようにデータを読み込むのか説明してください。私はI/Oの動作とフォーマットオプションを理解していると思っていましたが、以下の例では私は困惑しています。私はFortranがテキストファイルからフロートを読む - 奇妙な動作

221 
500.0200 
500.0000 

このファイルに以下の3つの行を含むテキストファイルDomain.txtから3つの値を読み込むしようとしています

は、その後

program main 
implicit none 
integer :: N 
real :: xmax,xmin 

open(unit=1,file='Domain.txt') 

read(1,*) N  ! Read first line 
read(1,*) xmax ! Read second line 
read(1,*) xmin ! Read third line 

print*, N 
print*, xmax 
print*, xmin 
end program 

以下の私のプログラムで、この結果を読まれますプログラムは

 221 
500.019989 
500.000000 

私の混乱は、 xmax変数のecond出力。 2行目で500.019989と表示され、500.0200でないのはなぜですか?

私は小文字の後ろの最初の2桁だけを読み上げると言っても、読んだ文ではformat(fm.d)という形式の書式を使用しようとしましたが、問題を解決できませんでした。

私はgfortran 4.8.5を使用しています。どんな助けもありがとう。私はまた、これがここで質問された質問と重複していることも知っていますが(Reading REAL's from file in FORTRAN 77 - odd results)、私はコメントして解決策について質問するだけの十分な評判はありません。

+0

また、ファイルから読み込むときに精度を調べる[この質問](http://stackoverflow.com/q/33319357)もあります。 – francescalus

答えて

1

数字2/100(これは500.02の小数部分です) は、バイナリで有限表現をしていません。それは を持っている無限周期表現 0.0000001010001111010111000010100011110101110000101 ... だから、値が切り捨てられるか、浮動小数点数の 表現モデルに適合し、読み出し中など として表示されるように丸められます。 これは、浮動小数点数のバイナリ表現を持つすべての言語(Fortran、C、C++、Java ...など) の反応を示します。

+0

だから、あなたは、Fortranがテキストファイルから文字列値を正しく読み取ることができると言いますが、この文字列を実数に変換すると、この変換が浮動小数点エラーにつながります。私はPythonスクリプトから出力テキストファイルを書き、Fortranコードの入力で異なる結果を見つけたので、ちょっと混乱しました。 – arie64

+1

fortranのデフォルトの実数は単精度のみであるため、問題が明白に現れることに注意してください。 'double precision'を宣言すると、' 500.0200000'が表示されます(しかし、バイナリ表現の根本的な問題は十進数と正確には一致しませんが、Pythonでもそうです) – agentp