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

时间:2012-01-30 10:38:42

标签: python c numpy

numpy.float128在内部映射到什么精度?是__float128还是长双? (或完全不同的东西!?)

如果有人知道,可能会有一个问题:在C中将__float128强制转换为(16字节)长双精度是否安全? (这是为了与长期双打的C lib接口。)

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

为了清楚起见,我感兴趣的是 precision ,而不是元素的大小。

3 个答案:

答案 0 :(得分:36)

numpy.longdouble指的是C编译器调用long double的任何类型。目前,这是numpy支持的扩展精度浮点类型。

在x86-32和x86-64上,这是一个80-bit floating point type。在更奇特的系统上,它可能是其他东西(Sparc上的IIRC它是一个实际的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即可。或者更好的是坚持双打,除非你有一个真正令人信服的理由。它们会更快,更便携等等。

答案 1 :(得分:7)

非常建议使用longdouble instead of float128,因为它非常a mess,ATM。 Python将在初始化期间将其强制转换为float64。

在numpy里面,它可以是双倍或长双倍。它在npy_common.h中定义,取决于您的平台。我不知道你是否可以在开源代码中将它包含在你的源代码中。

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

答案 2 :(得分:3)

来自 numpy docs 的 TLDR:

<块引用>

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