Python 哪些系统不使用 IEEE-754 双精度浮点数
on what systems does Python not use IEEE-754 double precision floats
Python 对 IEEE 754 浮点运算进行了各种引用,但不保证 1 2 它会在运行时使用。因此,我想知道哪里不是这种情况。
CPython 源代码遵循 C 编译器用于 double
的任何内容,实际上是所有常见系统上的 IEEE 754-2008 binary64
意识到,例如:
- Linux 和 BSD 发行版(例如 FreeBSD、OpenBSD、NetBSD)
- 英特尔 i386/x86 和 x86-64
- ARM:AArch64
- 功率:PPC64
- MacOS 支持的所有架构都兼容 754
- Windows x86 和 x86-64 系统
我知道还有其他 platforms 它是众所周知的,但不知道它们在实践中是如何工作的。
理论上,正如您所说,CPython 被设计为可在任何平台上构建和使用,而无需关心他们的 C double
使用的 floating-point 格式。
在实践中,有两件事是正确的:
据我所知,在过去的 15 年里,CPython 还没有遇到过不使用 IEEE 754 binary64 格式作为其 C double
的系统(虽然我很想听到相反的故事;我已经在会议等类似场合询问了一段时间)。我的知识距离完美还有 长 的距离,但我参与 CPython 核心开发的数学和 floating-point 相关方面至少有 13 年那15年,关注floating-point那段时间的相关问题。我没有在错误跟踪器或其他地方看到任何迹象表明有人试图在使用 IEEE 754 binary64 以外的 floating-point 格式的系统上 运行 CPython。
强烈怀疑现代CPython确实第一次遇到这样的系统,会出现大量的测试失败,因此核心开发人员可能会很快发现它。虽然我们已经努力做到 format-agnostic,但目前几乎不可能在其他格式上对 CPython 进行任何测试,而且很可能有些地方隐含地假设 IEEE 754格式或语义,这将打破更奇特的东西。我们还没有看到任何此类破损的报告。
上面的“无错误报告”报告有一个例外。就是这个问题:https://bugs.python.org/issue27444。在那里,Greg Stark 报告说确实存在使用 VAX floating-point 的失败。我不清楚原始错误报告是否来自模拟 VAX floating-point.
的系统
我在 2008 年加入了 CPython 核心开发团队。那时,当我在处理 floating-point 相关问题时,我试图记住 5 种不同的 floating-point 格式: IEEE 754 binary64,IBM 的 hex floating-point 格式,用于他们的 zSeries 大型机,Cray floating-point 格式用于 SV1 和更早的机器,以及 VAX D-float 和 G-float格式;其他任何事情都太古老了,不值得担心。从那以后,VAX 格式不再值得关心。 Cray 机器现在使用 IEEE 754 floating-point。 IBM 十六进制 floating-point 格式仍然存在,但实际上相关的 IBM 硬件 也 支持 IEEE 754,而 IBM 机器 Python似乎所有人都在使用 IEEE 754 floating-point.
与奇异的 floating-point 格式不同,现代挑战似乎更多地与遵守 IEEE 754 标准的其余部分的变化有关:不支持 NaN 或以不同方式对待次正规的系统,或者允许对中间操作使用更高的精度,或者编译器进行 behaviour-changing 优化。
以上都是关于CPython-the-implementation,而不是Python-the-language。但是 Python 语言的故事在很大程度上是相似的。理论上,它不对 floating-point 格式做任何假设。实际上,我不知道有任何其他 Python 实现不会最终使用 float
类型的 IEEE 754 二进制格式(如果不是语义的话)。 IronPython 和 Jython 都以 运行 次为目标,明确表示 floating-point 将是 IEEE 754 binary64。 Python 的 JavaScript-based 版本可能同样会使用 JavaScript 的 Number
类型,ECMAScript 标准要求它是 IEEE 754 binary64。 PyPy 运行s 在 more-or-less 与 CPython 相同的平台上,具有相同的 floating-point 格式。 MicroPython 使用 single-precision 作为其 float
类型,但据我所知,它实际上仍然是 IEEE 754 binary32。
Python 对 IEEE 754 浮点运算进行了各种引用,但不保证 1 2 它会在运行时使用。因此,我想知道哪里不是这种情况。
CPython 源代码遵循 C 编译器用于 double
的任何内容,实际上是所有常见系统上的 IEEE 754-2008 binary64
意识到,例如:
- Linux 和 BSD 发行版(例如 FreeBSD、OpenBSD、NetBSD)
- 英特尔 i386/x86 和 x86-64
- ARM:AArch64
- 功率:PPC64
- MacOS 支持的所有架构都兼容 754
- Windows x86 和 x86-64 系统
我知道还有其他 platforms 它是众所周知的,但不知道它们在实践中是如何工作的。
理论上,正如您所说,CPython 被设计为可在任何平台上构建和使用,而无需关心他们的 C double
使用的 floating-point 格式。
在实践中,有两件事是正确的:
据我所知,在过去的 15 年里,CPython 还没有遇到过不使用 IEEE 754 binary64 格式作为其 C
double
的系统(虽然我很想听到相反的故事;我已经在会议等类似场合询问了一段时间)。我的知识距离完美还有 长 的距离,但我参与 CPython 核心开发的数学和 floating-point 相关方面至少有 13 年那15年,关注floating-point那段时间的相关问题。我没有在错误跟踪器或其他地方看到任何迹象表明有人试图在使用 IEEE 754 binary64 以外的 floating-point 格式的系统上 运行 CPython。强烈怀疑现代CPython确实第一次遇到这样的系统,会出现大量的测试失败,因此核心开发人员可能会很快发现它。虽然我们已经努力做到 format-agnostic,但目前几乎不可能在其他格式上对 CPython 进行任何测试,而且很可能有些地方隐含地假设 IEEE 754格式或语义,这将打破更奇特的东西。我们还没有看到任何此类破损的报告。
上面的“无错误报告”报告有一个例外。就是这个问题:https://bugs.python.org/issue27444。在那里,Greg Stark 报告说确实存在使用 VAX floating-point 的失败。我不清楚原始错误报告是否来自模拟 VAX floating-point.
的系统我在 2008 年加入了 CPython 核心开发团队。那时,当我在处理 floating-point 相关问题时,我试图记住 5 种不同的 floating-point 格式: IEEE 754 binary64,IBM 的 hex floating-point 格式,用于他们的 zSeries 大型机,Cray floating-point 格式用于 SV1 和更早的机器,以及 VAX D-float 和 G-float格式;其他任何事情都太古老了,不值得担心。从那以后,VAX 格式不再值得关心。 Cray 机器现在使用 IEEE 754 floating-point。 IBM 十六进制 floating-point 格式仍然存在,但实际上相关的 IBM 硬件 也 支持 IEEE 754,而 IBM 机器 Python似乎所有人都在使用 IEEE 754 floating-point.
与奇异的 floating-point 格式不同,现代挑战似乎更多地与遵守 IEEE 754 标准的其余部分的变化有关:不支持 NaN 或以不同方式对待次正规的系统,或者允许对中间操作使用更高的精度,或者编译器进行 behaviour-changing 优化。
以上都是关于CPython-the-implementation,而不是Python-the-language。但是 Python 语言的故事在很大程度上是相似的。理论上,它不对 floating-point 格式做任何假设。实际上,我不知道有任何其他 Python 实现不会最终使用 float
类型的 IEEE 754 二进制格式(如果不是语义的话)。 IronPython 和 Jython 都以 运行 次为目标,明确表示 floating-point 将是 IEEE 754 binary64。 Python 的 JavaScript-based 版本可能同样会使用 JavaScript 的 Number
类型,ECMAScript 标准要求它是 IEEE 754 binary64。 PyPy 运行s 在 more-or-less 与 CPython 相同的平台上,具有相同的 floating-point 格式。 MicroPython 使用 single-precision 作为其 float
类型,但据我所知,它实际上仍然是 IEEE 754 binary32。