在 Fortran 中读取浮点数时出错
Posted
技术标签:
【中文标题】在 Fortran 中读取浮点数时出错【英文标题】:Error when reading in float in Fortran 【发布时间】:2012-01-18 14:32:39 【问题描述】:这应该很简单,但我无法在 Fortran 中读取浮点数。我的程序 test.f 看起来像这样:
PROGRAM TEST
open(UNIT=1,FILE='test.inp')
read(1,'(f3.0)')line
STOP
END
输入文件test.inp
只包含一个浮点数:1.2
现在我的测试文件编译正常,但是当我运行它时出现错误:
在文件 test.f 的第 4 行 (unit = 1, file = 'test.inp')
Fortran 运行时错误:格式化传输中第 1 项的预期为 REAL,得到 INTEGER
(f3.0)
^
我尝试了对代码的不同修改,并在谷歌上搜索了错误消息,但没有结果。任何帮助将不胜感激!
问候, 弗兰克
【问题讨论】:
虽然这不能回答问题,但您确实应该声明您使用的所有变量的类型。在您的代码中,您没有说明line
的类型。将行 implicit none
包含在程序、函数、子例程或模块的顶部(在任何 use
语句之前)是一种很好的做法。您使用的隐式类型声明可能会导致许多令人讨厌的、难以发现的错误。
这确实回答了这个问题。
【参考方案1】:
您的变量line
被隐式定义为整数。这不适用于f
编辑描述符。如果要读取整数,请使用i
编辑描述符(例如i3
)。否则,将 line
声明为对“f”描述符进行数学运算的真实值。
另外注意:.0 不是问题,因为如果 Fortran 得到一个带小数点的数字,描述符中的 .0 部分将被忽略。它仅在输入没有小数的数字时使用,然后它使用描述符中小数点后面的数字将小数点添加到正确的位置。对于F8.5
,123456789
读作123.45678
。更多关于这里http://software.intel.com/sites/products/documentation/hpc/compilerpro/en-us/fortran/lin/compiler_f/lref_for/source_files/pghredf.htm。
【讨论】:
123456789
被读作123.45678
正是我个人尽可能避免指定格式的原因。【参考方案2】:
在你的阅读声明中
read(1,'(f3.0)')line
f3.0
告诉 tour 程序读取小数点后 0 位的 3 位数字(这就是 n.m 语法的含义)。所以我假设程序只是从文件中读取1
(不是1.2
),它是一个整数。尝试用类似的东西替换那行
read(1,'(f3.1)')line
不过,如果您文件中的数字可能会发生变化并大于 9.9 或多于一位小数,则您应该将字段宽度增加到大于 3 的值。
有关在 Fortran 中读写的更多信息,请参阅 read
intrinsic 和 data edit descriptors 的文档。
编辑:格式说明符,即读取语句中引号中的第二个参数,格式为fw.d
,其中f
表示要读取的数据是浮点数,@ 987654331@ 是字段的宽度,包括所有空格和小数点,d
指定小数点右侧的位数。
【讨论】:
读取实数时获取输入时没有小数点的数字不会导致运行时错误。有了这个read(1,'(f3.1)')
行,Fortran 会将11
读作1.1
。
如果项目有小数点,“f”描述符的“w”部分在输入时被覆盖。这不是这里的问题。
@VladimirF 好点。格式描述符和我尝试远离的东西,但问题代码中的.0
对我来说是错误的可能原因,但是,进一步调查你的答案显然是这里的解释。 @M.S.B.假设行是 real
,格式描述符 '(f1.1)'
、'(f2.1)'
和 '(f3.1)'
分别读取 0.1、1.0 和 1.2,所以 'w' 部分不会被忽略 - 还是我在这里遗漏了什么?
一个错误:我的意思是写“w.d”的“d”部分在输入时被忽略,如果输入字符包含小数点。因此,“F”格式规范的这一部分对输入几乎没有影响,因为人们实际上总是在浮点数中包含小数点。在纸牌时代,人们会通过省略小数点并依靠格式说明符来定位小数点来节省击键。【参考方案3】:
我建议读取/写入列表格式的数据,除非您有非常充分的理由不这样做。假设您正在从一行中只有一个浮点数或整数的文件中读取,像这样
123.45
11
42
那么这应该做阅读
real*8 :: x,y,z
open(1,file=filename)
read(1,*)x
read(1,*)y
read(1,*)z
close(1)
【讨论】:
大概你的意思是列表导向的格式而不是无格式,因为无格式意味着,通俗地说,二进制数据。以上是关于在 Fortran 中读取浮点数时出错的主要内容,如果未能解决你的问题,请参考以下文章