无法在64位体系结构的Python中使用128位浮点

无法在64位体系结构的Python中使用128位浮点,python,numpy,128-bit,Python,Numpy,128 Bit,我检查了python终端中指针的大小(在IDE中) 通过 我有一个64位的体系结构,可以使用numpy.float64很好。但是我不能使用np.float128 np.array([1,1,1],dtype=np.float128) 或 结果: AttributeError: 'module' object has no attribute 'float128' 我正在运行以下版本: sys.version_info(major=2, minor=7, micro=6, releaselev

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

我有一个64位的体系结构,可以使用
numpy.float64
很好。但是我不能使用
np.float128

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

结果:

AttributeError: 'module' object has no attribute 'float128'
我正在运行以下版本:

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

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

我在64位Ubuntu14.04系统上使用的是带有
sys.version\u info(大调=2,小调=7,小调=9,releaselevel='final',serial=0)

128位浮点数工作正常:

import numpy
a = numpy.float128(3)
这可能是一个分配问题。尝试:

  • 检查路径中的python版本是否为anaconda或提供的版本
编辑: 根据评论更新:

不是我的反对票,但这篇文章并没有真正回答“为什么不呢?” np.128“我的机器上是否存在”隐含问题。真正的答案是 这是特定于平台的:float128存在于某些平台上,但 不是其他的,在那些确实存在它的平台上,它几乎 当然是简单的80位x87扩展精度类型,填充到128位 位–马克·迪金森


对我来说,问题是一个Python模块在Windows中有问题(对于那些关心它的人来说是PyOpenGL)。该站点有Python控制盘,其中包含许多流行模块的“固定”版本,以解决float128问题



注:此问题有公认的答案。对于未来的搜索者,我的回答是,由于这个问题在谷歌搜索结果中很重要,
模块“numpy”没有属性“float128”

这几乎肯定不是128位浮点,至少在IEEE 754二进制128格式的意义上不是。这是一个包含48位填充的80位浮点。请尝试执行
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:因为浮点意味着浮点(二进制)点!移动点的能力允许在很大范围内表示值,但不能神奇地提供额外的精度。有关更多信息,请参阅任何指南。这些评论并不是讨论这个问题的合适地方…@Matthias:除非你有一个非常不寻常的平台(例如IBM大型机),否则NumPy几乎肯定不会让你访问真正的128位浮点。在某些平台上,NumPy支持1985版IEEE 754标准中定义的x87 80位浮点格式,在其中一些平台上,该格式报告为
float128
(而在其他平台上报告为
float96
)。但是这里所发生的一切是,你有一个80位的格式,有48位(或16位)的填充。@padraickenningham
np.longdouble
导致
np.float64
@padraickenningham确切的大小其实并不重要,只要我的精度比float64高(用于比较正交规则)@马蒂亚斯:那你可能就走运了。你在Windows上吗?IIRC,Windows平台将
longdouble
定义为与
double
相同的类型,因此
np.longdouble
不会给您任何额外的精度。
sys.version_info(major=2, minor=7, micro=6, releaselevel='final', serial=0)
import numpy
a = numpy.float128(3)