0

ファイルに実際のデータのリストがあります。実際のデータは次のようになります。

 25.935
 25.550
 24.274
 29.936
 23.122
 27.360
 28.154
 24.320
 28.613
 27.601
 29.948
 29.367

以下のように、このデータを配列に読み込む fortran90 コードを記述します。

PROGRAM autocorr
implicit none

INTEGER, PARAMETER :: TRUN=4000,TCOR=1800

 real,dimension(TRUN) :: angle

real :: temp, temp2, average1, average2
integer :: i, j, p, q, k, count1, t, count2

REAL, DIMENSION(0:TCOR) :: ACF

 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

open(100, file="fort.64",status="old")
do k = 1,TRUN
    read(100,*) angle(k)
end do

次に、もう一度印刷して値を確認すると、

25.934999
25.549999
24.274000
29.936001
23.122000
27.360001
28.153999
24.320000
28.613001
27.601000
29.948000
29.367001
32.122002
33.818001
21.837000 29.283001
26.489000
24.010000
27.698000
30.799999
36.157001
29.034000
34.700001
26.058001
29.114000
24.177000
25.209000
25.820999
26.620001
29.761000

値が小数点以下 6 桁になった理由を教えてください。計算結果に影響を与えないように、この影響を回避するにはどうすればよいですか?

どんな助けにも感謝します。ありがとう

4

1 に答える 1

1

値を再度書き出すために使用するステートメントは表示されません。したがって、次のようなFortran のリスト出力を使用したのではないかと思います。

write(output_unit,*) angle(k)

これを行った場合、プログラムが表示する桁数の制御をコンパイラーに委ねたことになります。これ*が、明示的な形式の代わりに を使用することの意味です。標準では、コンパイラは数値の適切な表現を使用できると述べています。

したがって、表示されているのは、単精度浮動小数点数が提供するものについての 8 sf で表示された数値です。小数点以下 3 桁のみの数値を表示する場合は、次のように記述できます。

write(output_unit,'(f8.3)') angle(k)

またはそのバリエーション。

angleタイプreal;であると宣言しました。デフォルトをコンパイラ フラグで上書きしていない限り、これは単精度の IEEE754 浮動小数点数を使用していることを意味します (特殊なコンピューター以外では)。ほとんどの実数 (数学的な意味で) は浮動小数点で正確に表現されず、正確な数に対する単精度 10 進近似は;25.935になる可能性が高いことにも注意してください。25.934999出力する他の数値は、プログラムが読み取る数値の浮動小数点近似値のようです。

より低い精度で結果を計算したい場合は、巧妙なプログラミング手法を採用する必要があります。

于 2012-12-10T18:32:54.883 に答える