据我所知,在 C 和 C++ 中处理浮点异常有两种选择:
首先,如果您禁用/屏蔽浮点异常(大多数环境默认这样做),您可以通过调用fetestexcept查看是否发生了任何浮点异常。fetestexcept 在 Visual C++ 中不可用,但您可以很容易地窃取 MinGW 运行时的实现。(它在公共领域。)一旦标记了异常,在调用 feclearexcept 之前它不会被清除,因此您可以在一系列计算结束时调用 fetestexcept 以查看其中是否有任何引发异常。这不会为您提供您要求的陷阱,但它确实可以让您测试是否发生了诸如 NaN 或 +/-inf 之类的问题并根据需要做出反应。
其次,您可以通过在 Linux中调用feenableexcept或在 Windows中调用_controlfp来启用/取消屏蔽浮点异常。操作系统如何处理处理器生成的浮点异常取决于您的操作系统。
- 在 Linux 中,操作系统会发送一个 SIGFPE 信号,因此您可以安装一个信号处理程序来捕获它并设置一个标志来告诉您的例程做出适当的反应。
- 在 Windows 中,操作系统调用结构化异常处理以将处理器异常转换为可以使用 C 中的
__try
/__catch
块或C++ 中的try
/块捕获的语言异常。catch
- 更新:对于 Mac OS X,如本答案中所述,您应该能够使用
_MM_SET_EXCEPTION_MASK
from启用/取消屏蔽异常xmmintrin.h
,并且只要您使用默认编译器选项(即,不要禁用 SSE),您应该能够使用 SIGFPE 捕获异常。
(如果你好奇的话,我在这篇博文中写了更多关于 C 和 C++ 中的这个和其他浮点问题的文章。)