强制 gfortran 在第一个 NaN 处停止程序
为了调试我的应用程序(fortran 90),我想将所有 NaN 转换为信号 NaN。
使用默认设置,我的程序在没有任何信号的情况下运行,仅在文件中输出 NaN 数据。我想找到生成 NaN 的点。如果我可以用 NaN 信号重新编译程序,我将在第一个错误浮动操作所在的第一个点得到一个 SIGFPE 信号。
To debug my application (fortran 90) I want to turn all NaNs to signalling NaN.
With default settings my program works without any signals and just outputs NaN data in file. I want find the point, where NaN is generated. If I can recompile program with signalling NaN, I will get an SIGFPE
signal at first point where first wrong floating operation reside.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您要查找的标志是
-ffpe-trap=invalid
;我通常添加,zero,overflow
来检查相关的浮点异常。然后编译它并在调试器中运行它会给出:
使用 intel fortran 编译器 (ifort),使用选项
-fpe0
将执行相同的操作。对于 C/C++ 代码来说,这是一个小技巧;我们必须实际插入对
feenableexcept()
的调用,该调用启用浮点异常,并在fenv.h
中定义;但效果是相同的:
无论哪种方式,您都可以更好地处理错误发生的位置。
The flag you're looking for is
-ffpe-trap=invalid
; I usually add,zero,overflow
to check for related floating point exceptions.Then compiling it and running it in a debugger gives:
With the intel fortran compiler (ifort), using the option
-fpe0
will do the same thing.It's a little tricker with C/C++ code; we have to actually insert a call to
feenableexcept()
, which enables floating point exceptions, and is defined infenv.h
;but the effect is the same:
either way, you have a much better handle on where the errors are occuring.