numpy.float128 的内部精度是多少?

38
numpy.float128 内部映射的精度是什么?是 __float128 还是 long double?或者完全不同的东西?如果有人知道,可能会有一个后续问题:在 C 中,将 __float128 强制转换为 (16 字节) long double 是安全的吗,只会有精度损失吗?(这是为了与操作 long double 的 C 库进行接口设计。)编辑:回应评论,平台是“Linux-3.0.0-14-generic-x86_64-with-Ubuntu-11.10-oneiric”。现在,如果 numpy.float128 的精度因平台而异,那对我也是有用的知识!请注意,我感兴趣的是精度,而不是元素的大小。

“版本号后面跟着的数字对应于特定平台上可用的具有至少该位数的单词。" 这句话很清楚。128位。那有什么困惑的呢?这是与平台相关的,而你没有列出平台信息,因此无法按照你的问题回答。请更新问题并提供确切的Python平台信息。提示:有一个platform包。 - S.Lott
2
“似乎很清楚”--假设在特定平台上没有可用的类型时会发生什么。 - Steve Jessop
3
我一直以为numpy的精度是与平台无关的,所以有相反信息肯定很有用。我会认为float128映射到类似于__float128内部的东西,但在我的系统上,long double也是128位,所以也有可能是这种情况。 - Henry Gomersall
假设numpy的精度与平台无关吗?为什么这么说呢?文档非常清楚地说明它不是与平台无关的。精度取决于元素的大小。64位是一个精度,128位是另一种精度。两者都在IEEE浮点规范中有所记载。你需要问的问题是:“我如何确定我的特定numpy使用的尺寸是多少?” - S.Lott
2
什么?这个问题是关于numpy.float128的。它的精度是否会因平台而异?我确实知道并非所有平台都提供该dtype,但假设那些提供的平台以相同的方式定义它并不太荒谬。您能否指向可能与此相矛盾的文档?这个页面甚至没有提到float128(但很好地定义了它所记录的那些类型)。我认为该类型映射到IEEE 754四倍精度类型是合理的,并且这就是我想要确认(或否定)的内容。 - Henry Gomersall
3个回答

58

numpy.longdouble是指您的C编译器称为long double的任何类型。当前,这是numpy支持的唯一扩展精度浮点类型。

在x86-32和x86-64上,这是一种80位浮点类型。在更奇特的系统上,它可能是其他东西(如果我没记错,在Sparc上它是一个实际的128位IEEE浮点数,在PPC上它是double-double)。 (它也可能取决于您使用的操作系统和编译器 - 例如,Windows上的MSVC根本不支持任何类型的扩展精度。)

Numpy还将导出一些名称,如numpy.float96numpy.float128。导出这些名称取决于您的平台/编译器,但您得到的任何名称始终引用与longdouble相同的基础类型。此外,这些名称非常误导人。它们并不表示96位或128位IEEE浮点格式。相反,它们指示底层long double类型使用的对齐位数。因此,例如,在x86-32上,long double是80位,但会填充到96位以保持32位对齐,并且numpy将其称为float96。在x86-64上,long double再次是相同的80位类型,但现在会填充到128位以保持64位对齐,并且numpy将其称为float128。没有额外的精度,只有额外的填充。

建议:忽略float96/float128名称,只使用numpy.longdouble。或者最好除非您有真正强烈的理由,否则坚持使用双精度。它们会更快,更便携等。


2
对于进行复杂操作的人,还有一个numpy.longcomplex可用。顺便说一句。 - Trevor Boyd Smith

15

建议使用longdouble而不是float128,因为目前情况相当混乱。在初始化期间,Python会将其转换为float64

在numpy内部,它可以是双精度或长双精度。它在npy_common.h中定义,并取决于您的平台。我不知道您是否可以将其直接包含到源代码中。

如果您在算法的这一部分不需要性能,则更安全的方法可能是将其导出为字符串,然后之后再使用strold


2
将指向float128数组的指针强制转换为long double,它在内存中是否正确?这对性能至关重要 ;) - Henry Gomersall
1
此外,阅读 npy_common.h 文件,似乎暗示它对平台相关的 long double 长度敏感(即如果 long double 是 128 位,则使用 long double),但我的 C 预处理器有点不稳定。 - Henry Gomersall
好的,我认为我已经大部分回答了那些问题。我可以将其转换为long double,一切都按预期工作。上面的参考资料表明,如果float128存在,则定义为long double,但我不确定这一点。 - Henry Gomersall
除了所有这些评论之外,numpy.longdouble在我的平台上被定义为numpy.float128,这使我可以完全使用longdouble进行工作,而longdouble始终是明确定义的。 - Henry Gomersall
@user4815162342,你的“down”链接挂了。 - markroxor
1
重新下载链接。我猜邮件列表的URL已经改变了,所以现在我们必须想办法找到新的URL。 - Trevor Boyd Smith

5
numpy文档中简述:

np.longdouble被填充到系统默认值; 为了满足用户的特定需求,提供了np.float96np.float128。尽管名称不同,np.float96np.float128提供的精度与np.longdouble相同,即,在大多数x86机器上为80位,而在标准Windows版本上为64位。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接