【问题标题】:Floating point exception when reading real values from an input file从输入文件中读取实数值时出现浮点异常
【发布时间】:2017-06-25 04:54:02
【问题描述】:

我尝试从Fortran 的输入文件中读取浮点值。

为此,我使用以下代码:

...
INTEGER            :: nf
REAL               :: re

OPEN(newunit=nf, file='toto.txt')

READ(unit=nf, fmt=*) re
...

toto.txt 包含我的真实价值的文本文件:

10.1001 ! this value is supposed to be read by the Fortran program 

如果我这样编译和执行,一切正常。

但是当我使用fpe 选项编译和执行时遇到了一些麻烦。 我在阅读行出现错误,如下所示:

Program received signal SIGFPE: Floating-point exception - erroneous arithmetic operation

Backtrace for this error
#0  0xfffffff
#1  0xfffffff
...

我使用gfortran 命令:gfortran -g1 -c -fbacktrace -ffpe-trap=invalid,zero,overflow,underflow,inexact,denormal -Wall -fcheck=all my_prog.f90

我认为我的阅读操作不正确。 那么这个错误正常吗?是否有读取实际值的正确方法?

【问题讨论】:

  • 我们需要完整的代码和输入文件。请参阅minimal reproducible example。行为不正常,问题可能出在其他地方。
  • 呃,不要使用inexact,denormal,除非你非常清楚自己在做什么,否则你真的不想使用它!
  • 来自 gfortran 文档:“许多(如果不是大多数)浮点运算会由于舍入而导致精度损失,因此 ffpe-trap=inexact 在实践中可能没有意义。”跨度>
  • 我不会再使用inexact, denormal了,但不是很感激吗?我认为我能抓住的错误越多,它就越好。无论如何,你是完全正确的,我的错误来自其他地方。当我尝试创建 MWE 时,我得到了同样的错误,但在阅读后很长时间的代码的另一部分。因此,我尝试使用“打印 toto”方法来查找问题所在,然后经过一些测试后,错误再次出现在读取行……移动错误非常令人不安。我将尝试查找更多信息并编辑我的问题。
  • 不,问题是inexact, denormal 确实只是捕捉错误。它还捕获了完全精细的构造。太频繁了。

标签: fortran precision gfortran sigfpe


【解决方案1】:

浮点异常 inexactdenormal 发生得太频繁了,并且在合法使用浮点运算期间是不精确的。几乎所有现实世界的浮点运算。即使从文件或键盘读取单个数字,因为并非所有十进制数字都可以精确存储为二进制。异常发生的频率略低,但使用仍然是合法的。

因此,捕获这些浮点异常是没有用的。甚至下溢也是有争议的。我不会默认捕获它,但我可以看到它的用处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-09
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多