Fortran 从文本文件中读取浮点数 - 奇怪的行为
Fortran Read Float From Text File - Odd behavior
谁能解释一下 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
?
我曾尝试在读取语句中使用 fortran 格式 format(fm.d)
来表示只读取小数点后的前两位数字,但我始终无法解决问题。
我正在使用 gfortran 4.8.5。任何帮助,将不胜感激。我也知道这与此处提出的问题有些重复 (Reading REAL's from file in FORTRAN 77 - odd results),但我没有足够的声誉来发表评论并提出有关解决方案的问题。
数字 2/100(即 500.02 的小数部分)
没有二进制的有限表示。它有
无限周期表示
0.0000001010001111010111000010100011110101110000101...
因此该值将被截断或四舍五入以适合
浮点数的表示模型并如此出现
在阅读过程中。
这就是所有语言(包括 Fortran、C、C++、Java...)
与浮点数的二进制表示反应。
谁能解释一下 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
?
我曾尝试在读取语句中使用 fortran 格式 format(fm.d)
来表示只读取小数点后的前两位数字,但我始终无法解决问题。
我正在使用 gfortran 4.8.5。任何帮助,将不胜感激。我也知道这与此处提出的问题有些重复 (Reading REAL's from file in FORTRAN 77 - odd results),但我没有足够的声誉来发表评论并提出有关解决方案的问题。
数字 2/100(即 500.02 的小数部分) 没有二进制的有限表示。它有 无限周期表示 0.0000001010001111010111000010100011110101110000101... 因此该值将被截断或四舍五入以适合 浮点数的表示模型并如此出现 在阅读过程中。 这就是所有语言(包括 Fortran、C、C++、Java...) 与浮点数的二进制表示反应。