Input 如何在fortran中检测列表定向输入中的NaN
我使用列表定向输入从输入文件中读取实值数据。通过Input 如何在fortran中检测列表定向输入中的NaN,input,fortran,nan,detect,Input,Fortran,Nan,Detect,我使用列表定向输入从输入文件中读取实值数据。通过iostat=iostatus检测NaN的最佳方法是什么 作为大型程序输入的示例,我需要读取如下文件: 1 NaN 1.0 2 nan 2.0 偶尔会有“NaN”而不是实数。 读取(ird,*,iostat=iostatus)nr,r1,r2时 UBUNTU上的gfortran 7.4.0没有标记iostatus 显然,输入错误被视为安静的NaN,而不是信令NaN。 gfortran编译器选项似乎没有提供将其转换为信号NaN的
iostat=iostatus
检测NaN的最佳方法是什么
作为大型程序输入的示例,我需要读取如下文件:
1 NaN 1.0
2 nan 2.0
偶尔会有“NaN”而不是实数。
读取(ird,*,iostat=iostatus)nr,r1,r2时
UBUNTU上的gfortran 7.4.0没有标记iostatus
显然,输入错误被视为安静的NaN,而不是信令NaN。
gfortran编译器选项似乎没有提供将其转换为信号NaN的选项。
fortran标准
不指定在列表定向输入中处理Nan
在第13.7.2.3.2节中,有关于格式化输入的信息,其中特别说明输入上的Nan被视为安静的Nan
我在NAG编译器上找到了一个文档,它明确指出输入上的NaN从未标记为信令NaN
《标准》中这些决策背后的理念让我无法理解。我本以为这是个错误
如果该行更改为:
read(ird, *, err=10, iostat=iostatus) nr, r1, r2
10 continue
iostatus变为+5001!但我真的不想回到古老的err=
子句
我知道我可以将行读入字符串,分析字符串中是否存在任何“NaN”,然后继续。我可以像示例中那样分析ieee\u is\u nan()
。然而,考虑到iostat=
子句,这似乎是不必要的乏味
有没有我错过的编译器选项
PROGRAM main
USE ieee_arithmetic
IMPLICIT NONE
INTEGER, PARAMETER :: IRD = 12
INTEGER :: iostatus
REAL :: r1 = -1.0, r2 = -1.0
INTEGER :: nr = 0
CHARACTER(LEN=1024) :: line = ' '
OPEN(UNIT=IRD,FILE='data.data', STATUS='old')
READ(IRD, *, IOSTAT=iostatus, IOMSG=line) nr, r1, r2
WRITE(*,*) iostatus, nr, r1, r2, ieee_is_nan(r1), line(1:LEN_TRIM(line))
r1 = -1.0
r2 = -1.0
READ(IRD, ERR=10, IOSTAT=iostatus, IOMSG=line) nr, r1, r2
10 CONTINUE
WRITE(*,*) iostatus, nr, r1, r2, ieee_is_nan(r1), line(1:LEN_TRIM(line))
CLOSE(UNIT=IRD)
END PROGRAM main
我的程序的输出是:(缩短的不重要的数字和空格)
在第一次读取时,iostatus设置为0,而在第二次读取时,iostatus设置为5001 您是否考虑过使用IEEE_算术模块?您读取数据,然后使用
IEEE_IS_NAN
内部子程序来检查NAN的每个值。是的,在我的实际程序中,我已经用类似于:if(iostatus/=0.或.IEEE_IS_NAN(r1)的内容纠正了这种情况然而,这将是一场维护噩梦,因为代码有150000行代码,有许多不同的输入部分。如果你不想让qNaN传播,你有两个选择:要么用ieee\u is\u NaN
检查NaN,要么(用gfortran)使用-ffpe trap=invalid选项。感谢francescalus的编辑,使我的问题更具可读性!Steve,我确实尝试了-ffpe trap=invalid、zero、overflow、denormal选项。即使我在r1处于NaN状态的第一次读/写之后添加了一行r2=r1+r2,程序仍然会持续运行,没有错误消息。Gfortran似乎有点不稳定nt到REAL,状态为NaN。我目前的结论是,在错误读取后,我必须立即添加err=claus和emtpy“continue”行,或者对iostatus和ieee_is_NaN进行组合测试。感谢您的深入了解。
0 1 NaN 1.00 T
5001 1 -1.00 -1.00 F
Missing format for FORMATTED data transfer