无法在64位体系结构的Python中使用128位浮点
我检查了python终端中指针的大小(在IDE中) 通过 我有一个64位的体系结构,可以使用无法在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
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或提供的版本
对我来说,问题是一个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位)的填充。@padraickenninghamnp.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)