28.16. fpectl —浮点异常控制

Note

fpectl模块不是默认构建的,不建议使用,除非有 maven 之手,否则它可能很危险。有关更多详细信息,另请参见关于限制的局限性和其他考虑部分。

大多数计算机都按照所谓的 IEEE-754 标准执行浮点运算。在任何实际计算机上,某些浮点运算都会产生无法表示为正常浮点值的结果。例如,try

>>> import math
>>> math.exp(1000)
inf
>>> math.exp(1000) / math.exp(1000)
nan

(上面的示例将在许多平台上运行.DECAlpha 可能是一个 exception.)“ Inf”是 IEEE-754 中的一种特殊的非数字值,表示“无穷大”,“ nan”表示“不是数字。 ”请注意,除了非数值结果外,当您要求 Python 进行这些计算时,没有什么特别的事情发生。实际上,这是 IEEE-754 标准规定的默认行为,如果对您有用,请立即停止阅读。

在某些情况下,最好在引发错误操作的地方引发异常并停止处理。在这种情况下可以使用fpectl模块。它提供了对来自多个硬件制造商的浮点单元的控制,允许用户在发生任何 IEEE-754 异常除以零,溢出或无效操作时打开SIGFPE的生成。与插入包装到组成您的 python 系统的 C 代码中的Pair包装宏一起,SIGFPE被捕获并转换为 Python FloatingPointError异常。

fpectl模块定义了以下Function,并且可能引发给定的异常:

  • fpectl. turnon_sigfpe ( )

    • 打开SIGFPE的生成,并设置适当的 signal 处理程序。
  • fpectl. turnoff_sigfpe ( )

    • 重置浮点异常的默认处理。
  • exception fpectl. FloatingPointError

    • 执行turnon_sigfpe()后,浮点运算将引发 IEEE-754 异常除以零,溢出或无效运算之一,这将依次引发此标准 Python 异常。

28.16.1. Example

以下示例演示了如何启动和测试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 <module>
FloatingPointError: in math_1

28.16.2. 局限性和其他考虑

设置给定的处理器以捕获 IEEE-754 浮点错误当前需要基于每个体系结构的自定义代码。您可能需要修改fpectl才能控制您的特定硬件。

将 IEEE-754 异常转换为 Python 异常需要将包装宏PyFPE_START_PROTECTPyFPE_END_PROTECT以适当的方式插入到您的代码中。 Python 本身已被修改以支持fpectl模块,但数值分析人员感兴趣的许多其他代码却没有。

fpectl模块不是线程安全的。

See also

源发行版中的某些文件可能对了解有关此模块如何运行的更多信息很有趣。包含文件Include/pyfpe.h详细讨论了此模块的实现。 Modules/fpetestmodule.c给出了几个使用示例。在Objects/floatobject.c中可以找到许多其他示例。