fpectl
fpectl - 浮点异常控制
注意
该fpectl
模块不是默认生成的,其使用不受鼓励,并且除专家之外可能是危险的。有关更多详细信息,另请参阅限制和其他限制条件部分。
大多数计算机按照所谓的IEEE-754标准执行浮点运算。在任何实际的计算机上,某些浮点运算产生的结果不能表示为正常的浮点值。例如,尝试
>>> import math
>>> math.exp(1000)
inf
>>> math.exp(1000) / math.exp(1000)
nan
(上面的例子可以在很多平台上工作,DEC Alpha可能是一个例外。)“Inf”是IEEE-754中一个特殊的非数字值,代表“无穷大”,“nan”代表“不是数字。 “请注意,除了非数字结果之外,当您要求Python执行这些计算时,没有什么特别的事情发生。这实际上是IEEE-754标准中规定的默认行为,如果它适用于您,请立即停止阅读。
在某些情况下,在发生错误操作的地方提出异常并停止处理会更好。 fpectl模块用于这种情况。 它提供了对来自多个硬件制造商的浮点单元的控制,允许用户在发生任何IEEE-754异常除零,溢出或无效操作时开启SIGFPE生成。 与包含python系统的C代码中插入的一对包装宏一起,SIGFPE被捕获并转换为Python FloatingPointError异常
该fpectl
模块定义了以下功能并可能引发给定的异常情况:
fpectl.turnon_sigfpe()
打开SIGFPE的生成,并设置合适的信号处理程序。
fpectl.turnoff_sigfpe()
重置浮点异常的默认处理。
exception fpectl.FloatingPointError
在turnon_sigfpe()
执行完之后,一个浮点操作会引发IEEE-754异常部分中的一个被Zero,Overflow或Invalid操作,然后引发这个标准的Python异常。
1.例子
以下示例演示如何启动和测试fpectl
模块的操作。
>>> import fpectl
>>> import fpetest
>>> fpectl.turnon_sigfpe()
>>> fpetest.test()
overflow PASS
FloatingPointError: Overflow
div by 0 PASS
FloatingPointError: Division by zero
[ more output from test elided ]
>>> import math
>>> math.exp(1000)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
FloatingPointError: in math_1
2.限制和其他考虑
设置给定的处理器来捕捉IEEE-754浮点错误当前需要在每个体系结构的基础上定制代码。您可能需要修改fpectl
以控制您的特定硬件。
将IEEE-754异常转换为Python异常要求将包装器宏PyFPE_START_PROTECT和PyFPE_END_PROTECT以适当的方式插入到您的代码中。 Python本身已被修改为支持fpectl模块,但数值分析师感兴趣的许多其他代码没有。
该fpectl
模块不是线程安全的。
扩展内容
源代码分发中的一些文件可能对了解更多关于这个模块如何操作的内容感兴趣。包含文件Include / pyfpe.h在一定程度上讨论了该模块的实现。Modules / fpetestmodule.c给出了几个使用的例子。Objects / floatobject.c中可以找到许多其他示例。