gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:06:21 25 4
gpt4 key购买 nike

要调试我的应用程序(fortran 90),我想将所有NaN转换为发信号通知NaN。

使用默认设置,我的程序可以在没有任何信号的情况下运行,并且仅在文件中输出NaN数据。我想找到生成NaN的地步。如果我可以用信号NaN重新编译程序,那么我将在第一个错误的浮点操作所在的第一点得到一个SIGFPE信号。

最佳答案

您要查找的标志是-ffpe-trap=invalid;我通常添加,zero,overflow来检查相关的浮点异常。

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;


无论哪种方式,您都可以更好地处理发生错误的位置。

关于gcc - 强制gfortran在第一个NaN停止程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5636580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com