我想出于教育目的玩这些陷阱。
数值微积分中默认行为的一个常见问题是我们“错过”了错误运算中出现的 Nan(或 +-inf)。默认行为是通过计算进行传播,但某些操作(如比较)会破坏链条并释放 Nan,并且其余处理将继续,而不会在算法的先前步骤中确认奇点。
有时我们有办法对这种事件做出反应:延长一个函数(“在我的例子中,0/0 = 12”),或者在时域模拟中放弃步骤并尝试其他设置(例如预测器、步骤)大小或其他)。
所以我的问题是:您知道向开发人员公开 IEEE754 陷阱的语言吗?我不想为此而打扰 ASM。
据我所知,在 C 和 C++ 中进行浮点异常处理有两种选择:
首先,如果您禁用/屏蔽浮点异常(大多数环境默认情况下都会这样做),您可以通过调用来查看是否发生了任何浮点异常盛宴除外 http://linux.die.net/man/3/fetestexcept。 fetestexcept 在 Visual C++ 中不可用,但您可以轻松窃取 MinGW 运行时的实现。 (它属于公共领域。)一旦标记了异常,直到调用 feclearexcept 之前它不会被清除,因此您可以在一系列计算结束时调用 fetestexcept 来查看是否有任何计算引发了异常。这不会为您提供所需的陷阱,但它确实可以让您测试是否发生了 NaN 或 +/-inf 等问题并根据需要做出反应。
其次,您可以通过调用启用/取消屏蔽浮点异常收费的除外 http://linux.die.net/man/3/feenableexcept在 Linux 或_controlfp http://msdn.microsoft.com/en-us/library/e9b52ceh(VS.80).aspx在Windows中。操作系统如何处理处理器生成的浮点异常取决于您的操作系统。
- 在 Linux 中,操作系统发送 SIGFPE 信号,因此您可以安装信号处理程序来捕获该信号,并设置一个标志来告诉您的例程做出适当的反应。
- 在 Windows 中,操作系统调用结构化异常处理将处理器异常转换为语言异常,您可以使用
__try
/ __catch
C 中的块或try
/ catch
C++ 中的块。
-
Update:对于 Mac OS X,如中所述这个答案 https://stackoverflow.com/questions/247053/enabling-floating-point-interrupts-on-mac-os-x-intel/340683#340683,您应该能够使用启用/取消屏蔽异常
_MM_SET_EXCEPTION_MASK
from xmmintrin.h
,并且只要您使用默认编译器选项(即不禁用 SSE),您应该能够使用 SIGFPE 捕获异常。
(我在 C 和 C++ 中写了更多关于这个问题和其他浮点问题的文章这篇博文 http://codingcastles.blogspot.com/2009/01/floating-point-reference.html如果你好奇的话。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)