2017-04-03 5 views
1

Fortran言語で記述すると、DOループでcontrol-varとしてREAL値を設定すると、例えば:Fortranでdo-loop制御変数としてREAL型の値を使用すると、出力が奇妙になるのはなぜですか?

do i=0.1,1.0,0.1 
write (13,"(F15.6)") i 
end do 

アウトプットは、次のとおり0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0 .But私は0.6として開始値を設定する場合:0.6,0.7,0.8,0.9、及び1.0が出力されない:

do i=0.6,1.0,0.1 
write (13,"(F15.6)") i 
end do 

出力です。なぜこれが起こるのですか?

+2

この機能は使用しないでください。それは良い理由のため削除されました。これを失う。 –

答えて

6

これは基本的には丸めの問題です。Precision problems of real numbers in Fortranとそこから続くリンクを参照してください。 2つの浮動小数点の比較は難しく、doループではうまく動作しません。

あなたは以上の10進数を印刷しなければならないだけでなく、6:

0.1000000015 
    0.2000000030 
    0.3000000119 
    0.4000000060 
    0.5000000000 
    0.6000000238 
    0.7000000477 
    0.8000000715 
    0.9000000954 
    1.0000001192 

値は正確ではありません。

Fortranでは、ループの開始前に反復回数が計算されます。あなたがループトリップ数を計算する場合と:

9.0000000000 
    3.9999997616 

ので、後者が反復されるだけで4回(3 + 1 = 4を、ので、私= 0.6、0.7:

write (*,"(F15.10)") (1.0 - 0.1)/0.1 

write (*,"(F15.10)") (1.0 - 0.6)/0.1 

あなたが取得します、0.8と0.9)、カウントが3.999から3に切り捨てられているためです。

実際のループカウンタは十分な理由でFortranから削除されています。使用しないでください。丸めは問題の1つです。コンパイラが警告を表示する必要があります

警告:削除された機能は:犯罪でなければなりませんiとしてreal変数に名前を付ける、(1)でなければなりません 整数また

でDOループの中で表現を開始します。

関連する問題