强制gfortran在第一个NaN处停止程序

要调试我的应用程序(fortran 90),我想将所有NaN转换为发信号通知NaN。 使用默认设置,我的程序可以在没有任何信号的情况下运行,并且仅在文件中输出NaN数据。我想找到生成NaN的地步。如果我可以用NaN信号重新编译程序,那么我将在第一个错误的浮点运算所处的第一点得到一个“ 0”信号。     
已邀请:
您要查找的标志是
-ffpe-trap=invalid
;我通常加2来检查相关的浮点异常。
program nantest
    real :: a, b, c

    a = 1.
    b = 2.

    c = a/b
    print *, c,a,b

    a = 0.
    b = 0.

    c = a/b
    print *, c,a,b

    a = 2.
    b = 1.

    c = a/b
    print *,c,a,b
end program nantest
然后对其进行编译并在调试器中运行,将得到:
$ gfortran -o nantest nantest.f90 -ffpe-trap=invalid,zero,overflow -g -static
$ gdb nantest
[...]
(gdb) run
Starting program: /scratch/ljdursi/Testing/fortran/nantest 
  0.50000000       1.0000000       2.0000000    

Program received signal SIGFPE, Arithmetic exception.
0x0000000000400384 in nantest () at nantest.f90:13
13          c = a/b
Current language:  auto; currently fortran
对于intel fortran编译器(ifort),使用选项
-fpe0
将执行相同的操作。 使用C / C ++代码有点麻烦。我们实际上必须插入对
feenableexcept()
的调用,这会启用浮点异常,并在
fenv.h
中定义;
#include <stdio.h>
#include <fenv.h>

int main(int argc, char **argv) {  
    float a, b, c;
    feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);

    a = 1.;
    b = 2.;

    c = a/b;
    printf(\"%f %f %f\\n\", a, b, c);

    a = 0.;
    b = 0.;

    c = a/b;
    printf(\"%f %f %f\\n\", a, b, c);

    a = 2.;
    b = 1.;

    c = a/b;
    printf(\"%f %f %f\\n\", a, b, c);

    return 0;
}
但是效果是一样的:
$ gcc -o nantest nantest.c -lm -g
$ gdb ./nantest
[...]
(gdb) run
Starting program: /scratch/s/scinet/ljdursi/Testing/exception/nantest  
1.000000 2.000000 0.500000

Program received signal SIGFPE, Arithmetic exception.  
0x00000000004005d0 in main (argc=1, argv=0x7fffffffe4b8) at nantest.c:17  
17        c = a/b;  
无论哪种方式,您都可以更好地处理发生错误的位置。     

要回复问题请先登录注册