从输入文件读取实数值时出现浮点异常
Floating point exception when reading real values from an input file
我尝试从 Fortran
中的输入文件读取浮点值。
为此,我使用以下代码:
...
INTEGER :: nf
REAL :: re
OPEN(newunit=nf, file='toto.txt')
READ(unit=nf, fmt=*) re
...
with 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
我认为我的阅读操作不正确。
那么这个错误正常吗?有没有正确的方法来读取实际值?
浮点异常 inexact 和 denormal 发生得太频繁了,在合法使用浮点运算的过程中是不精确的。几乎所有 real-world 浮点运算。甚至从文件或键盘读取单个数字,因为并非所有十进制数都可以精确地存储为二进制。非正常发生的频率略低,但使用仍然是合法的。
因此,捕获这些浮点异常是没有用的。甚至下溢也是有争议的。默认情况下我不会捕获它,但我可以看到它的用处。
我尝试从 Fortran
中的输入文件读取浮点值。
为此,我使用以下代码:
...
INTEGER :: nf
REAL :: re
OPEN(newunit=nf, file='toto.txt')
READ(unit=nf, fmt=*) re
...
with 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
我认为我的阅读操作不正确。 那么这个错误正常吗?有没有正确的方法来读取实际值?
浮点异常 inexact 和 denormal 发生得太频繁了,在合法使用浮点运算的过程中是不精确的。几乎所有 real-world 浮点运算。甚至从文件或键盘读取单个数字,因为并非所有十进制数都可以精确地存储为二进制。非正常发生的频率略低,但使用仍然是合法的。
因此,捕获这些浮点异常是没有用的。甚至下溢也是有争议的。默认情况下我不会捕获它,但我可以看到它的用处。