我有一个文件中的实际数据列表。真实数据看起来像这样..
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个小数点吗? 如何避免这种影响,以免影响计算结果?
感谢任何帮助。 感谢
答案 0 :(得分:1)
您不会显示用于再次写出值的语句。因此,我怀疑您使用过Fortran的列表导向输出,类似这样的
write(output_unit,*) angle(k)
如果你这样做了,你已经放弃了对程序显示给编译器的位数的控制权。这就是使用*
代替显式格式的意思,标准说编译器可以使用任何合理的数字表示。
因此,您看到的数字是以8 sf显示的,这与单精度浮点数提供的数字有关。如果你想显示小数点后只有3位数的数字,你可以写
write(output_unit,'(f8.3)') angle(k)
或其中的一些变体。
您已将angle
声明为real
类型;除非您使用编译器标志覆盖了默认值,否则这意味着您使用的是单精度IEEE754浮点数(除了异国情况的计算机之外)。还要记住,大多数真实的(在数学意义上)数字在浮点中没有精确的表示,并且精确数字25.935
的单精度十进制近似可能是25.934999
;您打印的其他数字似乎是程序读取的数字的浮点近似值。
如果你真的想以较低的精度计算结果,那么你将不得不采用一些聪明的编程技术。