fortran90读数组与实数

时间:2012-12-08 02:03:52

标签: fortran90

我有一个文件中的实际数据列表。真实数据看起来像这样..

 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个小数点吗? 如何避免这种影响,以免影响计算结果?

感谢任何帮助。 感谢

1 个答案:

答案 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 ;您打印的其他数字似乎是程序读取的数字的浮点近似值。

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