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



我正在阅读有关 Python 文档中的fpectl— 浮点异常控制的信息。

它警告用户

......并且不鼓励使用它,除非在专家手中,否则可能是危险的。有关更多详细信息,另请参阅限制和其他注意事项部分。

为什么?

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

由于许多原因,"不防御性驾驶"不安全是不安全的。你可能会这样做,而且没有任何麻烦。或者你可能会倒霉,跑出马路,穿过中间地带,进入迎面而来的交通。

这只是它充其量是混乱的几个原因,并且很难以一种使用它来创建安全可靠的代码极其困难的方式进行推理:

  1. 它不是线程安全的。这意味着它将在线程中以不同的方式运行 与非线程程序相比,并且可能以不同的方式有所不同 几乎在每个线程程序中。
  2. 它所需的支持代码和行为可能会因 特定的浮点实现。所以如果你让你的代码工作 就在一个,这并不意味着你可以分发该代码 对其他系统或其他可能运行它的用户的安全 不同的 CPU 系列(例如 ARM vs x86 vs POWER(,或不同的 同一 CPU 系列的几代(例如 AMD 与英特尔 x86 的实现(。
  3. 浮点代码在 IEEE-754时代。但在那里 仍然是微妙的缺陷, 那些做的人 数值算法 采取预防措施。了解边界 条件,如何浮点近似 在这些边缘表现(或不表现(, 以及不同的FP实现如何处理它们仍然是 重要。减少变量是 在编写这些算法时限制风险的关键方法。 使用一个不太了解、记录不佳、很少使用, 非标准蟒蛇的一部分 异常处理模块与 "降低风险。">
  4. 风险涉及数据完整性。有可能是压制 异常会让不良或不一致的数据进入您的进一步 计算。 例外就像痛苦。 系统性信号表明出了问题或"不要那样做! 关闭它们在数值处理中有着悠久的历史 导致未捕获的数据损坏。在这个广泛传播的时代NaNInf支持,这比过去的可能性要小, 由于存在带内(在数据值中(信令机制 这可以是替代指标。 但是没有学习 源代码,你真的知道数据会发生什么吗OverflowError的地方 ?你能保证它会是一样的吗 结果,如果它在向量或标量FP指令中处理? 怀疑。 您的代码会知道其中的区别吗 在由压制的数值异常导致的NaN之间 与普通的缺失数据?应该不会。这么多新的 结果不确定!
  5. 文档本身基本上警告"您将需要 下拉并研究源代码,看看它是如何工作的。 这是一条重要的三重黑钻石之路。 他们没有在标准版本中启用它是有原因的。 如果你不这样做 已经了解旅行的数值分析注意事项 它,不适合你。