Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Input 如何在fortran中检测列表定向输入中的NaN_Input_Fortran_Nan_Detect - Fatal编程技术网

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