【发布时间】:2013-07-04 14:54:27
【问题描述】:
我很抱歉问了一个以前被问过很多次的问题。但是经过几次搜索,我意识到我可能对如何在 C/C++ 中处理 FPE 与如何在 Fortran 中处理它们之间存在根本性的误解。
在 Fortran(准确地说是 GNU fortran)中,如果想要捕获浮点异常(例如使用 NAN),编译器标志 -ffpe-trap=invalid 可以解决问题。一旦执行了违规语句,就会引发浮点异常。
然而,在 C (GNU gcc) 中,情况似乎并非如此。更烦人(但也许并不奇怪)是相同的 fortran 代码,当从 C 主程序调用时不会引发异常(并停止执行),而从 Fortran 主程序调用时会引发异常。这似乎与是否使用 C 或 gfortran 链接器无关。
经过大量搜索和阅读,我发现 fenv.h 中提供了 C/C++ 功能,这表明了处理异常的“C 方式”。我看到我可以设置异常标志,然后检查是否引发了异常。我可以看到这种方法如何为异常处理方式提供更多灵活性。这是在 C 中处理异常的“最佳实践”方式吗?对于科学编程(C 通常用于调用 fortran 代码),必须对异常可能发生的位置有一些高级知识似乎很不方便。
C 中是否没有(直接的)方法可以让代码在第一次出现异常时停止?或者当涉及到 C 中的异常处理时,我还没有完全掌握另一种范式吗?
【问题讨论】:
-
原来
feenableexcept()是非标准的。 this question 的答案有一些建议,this blog post 指出了一些适用于 linux 和 Mac OS X 的代码。 -
是的,我发现了这篇文章,并且引用的代码似乎完全符合我的期望。您是否知道所描述的扩展是否是一种合理的方法?
-
我还应该评论说,我寻找捕获异常的方法的主要目的是调试 fortran 代码中未初始化数据的使用。我的计划是使用 NaN 值初始化数据,然后在以后捕获这些值的使用。
-
我投了赞成票只是因为这个问题得到了很好的解释并且提问者知道他在寻找什么......
标签: c++ fortran scientific-computing floating-point-exceptions