为什么fpectl - 浮点异常控制如此危险?

4

我正在阅读Python文档中关于fpectl——浮点异常控制的内容。

它警告用户:

......并且除非由专家操作,否则使用可能是危险的,不建议使用。有关详细信息,请参见限制和其他注意事项部分。

为什么?

阅读链接的网页并没有帮助我。


最值得注意的是:为了捕获IEEE-754浮点错误,设置特定处理器目前需要针对每个架构编写自定义代码。不同的架构以不同的方式处理浮点数,因此需要自定义异常处理。同时fpectl模块不支持多线程。 - Easton Bornemeier
它基本上已经损坏且未维护。请参见此线程 - Mark Dickinson
fpectl在Python 3.7中已被移除 https://bugs.python.org/issue29137 - user3064538
1个回答

4
由于许多原因,它的不安全性类似于“不采取防御性驾驶”的不安全性。你可能使用它而毫发无损,也有可能倒霉撞到路边或者穿越中央隔离带撞上迎面而来的车辆。
以下只是一些混乱原因,且很难用一种合理的方式去推理,以便用它来创建安全、可靠的代码。
  • 它不是线程安全的。这意味着它在多线程和单线程程序中会表现出不同的行为,并且在几乎每个多线程程序中可能以不同的方式表现出来。
  • 它所需的支持代码和行为可能会因特定浮点实现而异。因此,如果您在一个系统上使您的代码正常工作,那并不意味着您可以将该代码安全地分发到其他系统或在不同CPU系列(例如ARM vs x86 vs POWER)或同一CPU系列的不同代(例如AMD vs Intel x86实现)上运行的其他用户。
  • 在IEEE-754时代,浮点代码非常易于移植。但是仍然存在微妙的缺陷,这些缺陷需要那些进行数值算法的人采取预防措施。了解边界条件,浮点近似如何(或未能)在这些边缘处行为以及不同FP实现如何处理它们仍然很重要。减少变量是编写这些算法时限制风险的关键方法。使用一个理解不足、文档不足、很少使用、不属于标准Python异常处理模块是“减少风险”的相反情况。
  • 风险涉及数据完整性。压制异常可能会导致错误或不一致的数据进入进一步的计算中。异常就像疼痛。系统信号表示出现问题或“不要那样做!”关闭它们在数值处理方面有很长的历史,导致未捕获的数据损坏。在广泛支持NaN和Inf的时代,这比过去的时代更不可能发生,因为有一些内部(在数据值中)的信号机制可以成为备用指示器。但是,在没有研究源代码的情况下,您真的知道在OverflowError的位置上发生的数据会发生什么吗?如果它在向量或标量FP指令中处理,您能保证结果将是相同的吗?可疑的。您的代码是否知道由于抑制数字异常而导致的NaN与普通缺失数据之间的区别?很可能不知道。因此,会有许多新的不确定结果!
  • 文档本身基本上警告“您需要下降并研究源代码以了解其真正的工作原理。”这是一个重要的、三重黑钻路径。他们没有在标准构建中启用它的原因。如果您不了解旅行的数值分析注意事项,那么它不适合您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接