【问题标题】:Fortran Read Float From Text File - Odd behavior [duplicate]Fortran 从文本文件中读取浮点数 - 奇怪的行为 [重复]
【发布时间】:2017-01-19 20:30:09
【问题描述】:

谁能解释一下 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。任何帮助,将不胜感激。我也知道这与此处提出的问题 (Reading REAL's from file in FORTRAN 77 - odd results) 有点重复,但我没有足够的声誉来评论和询问有关解决方案的问题。

【问题讨论】:

  • 可能还相关的是this question,它在从文件读取时查看精度。

标签: io floating-point fortran gfortran


【解决方案1】:

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

【讨论】:

  • 所以我猜你的意思是 Fortran 可以从文本文件中正确读取字符串值,但是在将此字符串转换为实数时,它已使这种转换导致浮点错误.我只是很困惑,因为我从 python 脚本编写了输出文本文件,并在 Fortran 代码的输入中发现了不同的结果。
  • 请注意,这个问题很明显,因为 fortran 的默认实数只有单精度。如果您声明double precision,您应该看到500.0200000 打印(尽管二进制表示与十进制数不完全匹配的潜在问题仍然存在,就像在python 中一样)
猜你喜欢
  • 1970-01-01
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多