Io Fortran从文本文件读取浮点-奇数行为

Io Fortran从文本文件读取浮点-奇数行为,io,floating-point,fortran,gfortran,Io,Floating Point,Fortran,Gfortran,有人能解释一下Fortran是如何读取数据的,尤其是从文本文件中读取的吗。我原以为我了解I/O的行为和格式选项,但下面的示例让我感到困惑 我试图从文本文件Domain.txt中读取三个值,其中包含如下所示的三行 221 500.0200 500.0000 然后,我下面的程序将读取此文件 program main implicit none integer :: N real :: xmax,xmin open(unit=1,file='Domain.txt') read(1,*)

有人能解释一下Fortran是如何读取数据的,尤其是从文本文件中读取的吗。我原以为我了解I/O的行为和格式选项,但下面的示例让我感到困惑

我试图从文本文件
Domain.txt
中读取三个值,其中包含如下所示的三行

221 
500.0200 
500.0000
然后,我下面的程序将读取此文件

program main
implicit none
integer :: N
real    :: xmax,xmin

open(unit=1,file='Domain.txt')

read(1,*) N      ! Read first  line
read(1,*) xmax   ! Read second line
read(1,*) xmin   ! Read third  line

print*, N
print*, xmax
print*, xmin
end program
这个项目的结果是

      221
500.019989
500.000000
因此,我对
xmax
变量的第二个输出感到困惑。为什么它在第二行读作
500.019989
,而不是
500.0200

我曾尝试在read语句中使用fortran格式
format(fm.d)
,表示只读取小数点后的前两位数字,但我始终无法解决此问题

我正在使用gfortran 4.8.5。任何帮助都将不胜感激。我也知道这有点重复这里提出的问题(),但我没有足够的声誉来评论和询问有关解决方案的问题。

数字2/100(500.02的小数部分) 没有二进制的有限表示形式。它有 无限周期表示 0.0000001010001111010111000010100011110101110000101... 因此,该值将被截断或四舍五入以适合 浮点数的表示模型,并显示为浮点数 在阅读过程中。 这就是所有语言(包括FORTRAN、C、C++、java……)
浮点数的二进制表示会起作用。

所以我猜您的意思是Fortran可以从文本文件中正确读取字符串值,但在将字符串转换为实数时,它会导致这种转换导致浮点错误。我非常困惑,因为我从python脚本编写了输出文本文件,并在Fortran代码的输入中发现了不同的结果。请注意,这个问题以一种明显的方式显示出来,因为Fortran的默认实数仅为单精度。如果声明
double precision
,您应该会看到打印的
500.0200000
(尽管二进制表示法与十进制数不精确匹配的根本问题仍然存在,就像python中一样),这可能与从文件读取时查看精度有关。