numpy.float128在内部映射到什么精度?是__float128还是长双? (或完全不同的东西!?)
如果有人知道,可能会有一个问题:在C中将__float128强制转换为(16字节)长双精度是否安全? (这是为了与长期双打的C lib接口。)
编辑:在回复评论时,该平台是' Linux-3.0.0-14-generic-x86_64-with-Ubuntu-11.10-oneiric'。现在,如果numpy.float128具有依赖于平台的不同精度,那对我来说也是有用的知识!
为了清楚起见,我感兴趣的是 precision ,而不是元素的大小。
答案 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.float96
或numpy.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.float96
和 np.float128
是为需要特定填充的用户提供的。尽管名称不同,np.float96
和 np.float128
仅提供与 np.longdouble
相同的精度,即,在大多数 x86 机器上为 80 位,在标准 Windows 版本中为 64 位。