【问题标题】:Cannot use 128bit float in Python on 64bit architecture不能在 64 位架构的 Python 中使用 128 位浮点数
【发布时间】:2015-07-01 11:37:16
【问题描述】:

我在我的 python 终端中检查了指针的大小(在 Enthought Canopy IDE 中) 通过

import ctypes
print (ctypes.sizeof(ctypes.c_voidp) * 8)

我有一个 64 位架构,使用 numpy.float64 就可以了。但是我不能使用np.float128

np.array([1,1,1],dtype=np.float128)

np.float128(1)

结果:

AttributeError: 'module' object has no attribute 'float128'

我正在运行以下版本:

sys.version_info(major=2, minor=7, micro=6, releaselevel='final', serial=0)

【问题讨论】:

  • @Matthias:除非你有一个非常不寻常的平台(例如,IBM 大型机),否则 NumPy 几乎肯定不会让你访问真正的 128 位浮点数。在某些平台上,NumPy 支持 1985 版 IEEE 754 标准中定义的 x87 80 位浮点格式,在某些那些平台上,该格式报告为float128(而在其他人报告为float96)。但是所有发生的事情是你有一个 80 位格式和 48 位(或 16 位)填充。
  • @PadraicCunningham np.longdouble 导致np.float64
  • @PadraicCunningham 只要我的精度比 float64 高(用于比较正交规则),确切的大小并不重要
  • @Matthias:那你可能不走运了。你在 Windows 上吗? IIRC,Windows 平台将long double 定义为与double 相同的类型,因此np.longdouble 不会给您任何额外的精度。

标签: python numpy 128-bit


【解决方案1】:

更新:从 cmets 看来,在 64 位系统上使用 128 位浮点数似乎毫无意义。

我在 64 位 Ubuntu 14.04 系统上使用 anaconda sys.version_info(major=2, minor=7, micro=9, releaselevel='final', serial=0)

128 位浮点数工作正常:

import numpy
a = numpy.float128(3)

这可能是分布问题。试试:

编辑: 来自 cmets 的更新:

不是我的反对意见,但这篇文章并没有真正回答“为什么不 np.float128 存在于我的机器上”暗示的问题。真正的答案是 这是特定于平台的:float128 存在于某些平台上,但 不是其他人,在确实存在的那些平台上,它几乎 当然只是 80 位 x87 扩展精度类型,填充到 128 位。 ——马克狄金森

【讨论】:

  • 几乎可以肯定 不是 128 位浮点数,至少在 IEEE 754 binary128 格式的意义上不是。它是一个 80 位浮点数,带有 48 位填充。
  • 试试numpy.float128(1) + numpy.float128(2**-64) - numpy.float128(1)。我怀疑你会得到0.0 的答案,表明float128 类型包含的精度不超过64 位。
  • @CharlieParker:是的,完全可以预料。在正常的双精度下,1.0 + 2**-64 不能完全表示(没有足够的有效位),所以加法的结果是最接近的双精度浮点 完全可表示,又是 1.0 .现在当然减去1.0 得到0.0。对于常规双精度,1.0 + 2**-53 - 1.0 也是如此(二进制精度为 53)。对于扩展的 x87 样式精度,使用通常的舍入到偶数,1.0 + 2**-64 - 1.0 将给出零,而 1.0 + 2**-63 - 1.0 将非零。
  • @CharlieParker:不是我的反对意见,但这篇文章并没有真正回答“为什么我的机器上不存在 np.float128”隐含的问题。真正的答案是这是特定于平台的:float128 存在于某些平台上,但不存在于其他平台上,而在确实存在的平台上,它几乎可以肯定只是 80 位 x87 扩展精度类型,填充到 128 位。
  • @CharlieParker:因为浮点意味着浮点(二进制)!移动点的能力允许以广泛的比例表示值,但不会神奇地提供额外的精度。有关更多信息,请参阅任何many floating-point 指南。这些 cmets 并不是这个讨论的真正合适的地方......
【解决方案2】:

对我来说,问题是一个 Python 模块在 Windows 中存在问题(PyOpenGL 适合那些关心的人)。 This 站点的 Python 轮子带有许多流行模块的“固定”版本,以解决 float128 问题。


注意:这个问题有一个可接受的答案。对于未来的搜索者,我的回答是,因为这个问题在 Google 搜索结果中的 module 'numpy' has no attribute 'float128' 很高。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 2014-01-10
    • 2015-08-27
    • 1970-01-01
    相关资源
    最近更新 更多