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为 type real; 除非您使用编译器标志覆盖了默认值,否则这意味着您使用的是单精度 IEEE754 浮点数(在异国计算机之外的任何计算机上)。还要记住,大多数实数(在数学意义上)没有浮点的精确表示,并且精确数字的单精度十进制近似值25.935可能是25.934999; 您打印的其他数字似乎是您的程序读取的数字的浮点近似值。

如果您真的想以较低的精度计算结果,那么您将不得不采用一些聪明的编程技术。

于 2012-12-10T18:32:54.883 回答