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

numpy.float128映射到内部有什么精度? 是__float128还是长双? (或其他完全!?)

一个潜在的问题,如果有人知道:在C中安全__float128一个(16字节)长的双重,只是在精度上的损失? (这是为了与长时间运行的C库进行交互)。

编辑:为了回应评论,平台是“Linux-3.0.0-14-generic-x86_64-with-Ubuntu-11.10-oneiric”。 现在,如果numpy.float128依赖于平台具有不同的精度,这对我来说也是有用的知识!

只是要清楚,这是我感兴趣的精度 ,而不是元素的大小。

推荐使用longdouble而不是float128 ,因为它非常混乱 ,ATM。 Python在初始化时会将其转换为float64。

内部numpy,它可以是一个双倍或长双。 它在npy_common.h中定义,取决于你的平台。 我不知道你是否可以把它包括在你的源代码中。

如果你不需要在algorithm的这个部分中使用性能,那么一个更安全的方法就是将它导出到一个string,然后再使用strold 。

numpy.longdouble引用你的C编译器调用的任何types。 目前,这是numpy支持的唯一扩展精度浮点types。

在x86-32和x86-64上,这是一个80位浮点types 。 在更奇特的系统上,它可能是别的东西(Sparc上的IIRC是一个实际的128位IEEE浮点数,在PPC上是双倍的 )。 (这也可能取决于你使用的操作系统和编译器 – 例如Windows上的MSVC根本不支持任何types的扩展精度。)

Numpy还会导出一些名称,如numpy.float96numpy.float128 。 这些名字中的哪一个被导出取决于你的平台/编译器,但无论你得到的是什么,总是指向与longdouble相同的基础types。 而且,这些名字也是非常具有误导性的。 它们表示96位或128位IEEE浮点格式。 相反,它们表示底层long doubletypes使用的alignment位数。 所以,例如在x86-32上, long double是80位,但是为了保持32位alignment,填充到96位,numpy调用这个float96 。 在x86-64上, long double又是相同的80位types,但是现在它被填充到128位以保持64位alignment,并且numpy调用这个float128 。 没有额外的精度,只是额外的填充。

build议:忽略float96 / float128名称,只需使用numpy.longdouble 。 或者更好,但坚持双打,除非你有一个真正令人信服的理由。 他们会更快,更便携,等等