Python 在哪些系统上不使用 IEEE-754 双精度浮点数

2024-06-19

Python 对 IEEE 754 浮点运算进行了各种引用,但不保证1 https://docs.python.org/3/tutorial/floatingpoint.html 2 https://pythondev.readthedocs.io/numbers.html它将在运行时使用。因此我想知道哪里不是这种情况。

CPython 源代码遵循 C 编译器使用的任何内容double,实际上是 IEEE 754-2008binary64在我所知道的所有常见系统上,例如:

  • Linux and BSD distros (e.g. FreeBSD, OpenBSD, NetBSD)
    • 英特尔 i386/x86 和 x86-64
    • ARM:AArch64
    • 功率:PPC64
  • MacOS 所有支持的架构均兼容 754
  • Windows x86 和 x86-64 系统

我知道还有其他平台 https://pythondev.readthedocs.io/platforms.html众所周知,它是建立在基础上的,但不知道这些在实践中是如何运作的。


更新:自从我在下面写下原始答案以来,情况略有变化。 CPython 版本 3.11 及更高版本现在要求平台 Cdouble遵循 IEEE 754 二进制 64 格式。这主要是为了方便开发人员——它允许我们删除实际上几乎无法测试的特殊情况代码。 Python 语言仍然没有规定需要 IEEE 754,并且没有什么可以阻止有人修补 CPython 以添加对不遵循 IEEE 754 的不寻常平台的支持;将结果称为“Python”仍然是合理的。此外,即使对于 CPython,仍然没有记录保证格式将是 IEEE 754 二进制 64 - 开发人员可以决定逆转 IEEE 754 二进制 64 要求。 (我个人认为这种情况极不可能发生,至少在未来十年内是这样,但这是有可能的。)


理论上,正如您所说,CPython 被设计为可在任何平台上构建和使用,而无需关心其 C 的浮点格式double正在使用。

在实践中,有两件事是正确的:

  • 据我所知,CPython 还没有遇到过不使用 IEEE 754 二进制 64 格式作为其 C 语言的系统。double过去 15 年内(尽管我很想听到相反的故事;我已经在会议等场合询问这个问题有一段时间了)。我的知识是一个long距离完美还有很长的路要走,但在这 15 年中,我至少有 13 年参与了 CPython 核心开发的数学和浮点相关方面,并在这段时间内密切关注与浮点相关的问题。我在 bug 跟踪器或其他地方没有看到任何迹象表明有人试图在使用 IEEE 754 二进制 64 以外的浮点格式的系统上运行 CPython。

  • 我强烈怀疑现代 CPython 第一次does遇到这样的系统,将会出现大量的测试失败,因此核心开发人员可能会很快发现它。虽然我们努力使事情与格式无关,但目前几乎不可能在其他格式上对 CPython 进行任何测试,并且很可能有一些地方隐式假定 IEEE 754 格式或语义,这将休息一下,尝试一些更具异国情调的东西。我们尚未看到任何有关此类破损的报告。

上面的“无错误报告”报告有一个例外。就是这个问题:https://bugs.python.org/issue27444 https://bugs.python.org/issue27444。在那里,Greg Stark 报告说使用 VAX 浮点确实出现了故障。我不清楚最初的错误报告是否来自模拟 VAX 浮点的系统。

我于 2008 年加入 CPython 核心开发团队。当时,当我研究浮点相关问题时,我试图记住 5 种不同的浮点格式:IEEE 754 二进制 64、IBM 的十六进制浮点格式,如他们的 zSeries 大型机、SV1 和早期机器中使用的 Cray 浮点格式以及 VAX D-float 和 G-float 格式;其他任何事情都太古老了,不值得担心。从那时起,VAX格式就不再值得关心了。 Cray 机器现在使用 IEEE 754 浮点。 IBM 十六进制浮点格式仍然存在,但实际上相关的 IBM 硬件also支持IEEE 754,Python遇到的IBM机器似乎都在使用IEEE 754浮点。

现代挑战似乎更多地与遵守 IEEE 754 标准其余部分的变化有关,而不是奇异的浮点格式:不支持 NaN 的系统,或以不同方式处理次正规数,或允许使用更高精度中间操作,或者编译器进行行为改变优化的地方。

以上都是关于 CPython 的实现,而不是 Python 的语言。但 Python 语言的情况大致相似。理论上,它不对浮点格式做出任何假设。在实践中,我不知道有任何替代的 Python 实现最终不会使用 IEEE 754 二进制格式(如果不是语义的话)float类型。 IronPython 和 Jython 的目标运行时均明确浮点为 IEEE 754 二进制 64。基于 JavaScript 的 Python 版本可能同样会使用 JavaScriptNumber类型,ECMAScript 标准要求其为 IEEE 754 binary64。 PyPy 运行在与 CPython 大致相同的平台上,具有相同的浮点格式。 MicroPython 使用单精度float类型,但据我所知,实际上仍然是 IEEE 754 binary32 。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 在哪些系统上不使用 IEEE-754 双精度浮点数 的相关文章

随机推荐