在 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.5123456789 读作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 中读取浮点数时出错的主要内容,如果未能解决你的问题,请参考以下文章

组态王使用485如何读取仪表浮点数?

在Fortran中设计一个大型可压缩二进制浮点数

使用浮点数遍历二维数组时出错

从文件中读取浮点数/单词/符号并仅将浮点数存储在数组 C++ 中

将两列文本文件中的浮点数读入Python中的数组时出错

为啥整数除以零 1/0 会出错但浮点数 1/0.0 返回“Inf”?