numpy.float128 的内部精度是多少?
- 2025-02-11 09:50:00
- admin 原创
- 50
问题描述:
内部映射到什么精度numpy.float128
?是__float128
长双精度吗?还是完全不同的东西?
如果有人知道的话,可能会出现一个后续问题:在 C 中将 a 转换__float128
为 (16 字节) 长双精度数是否安全,而只是精度有所损失?(这是为了与操作长双精度数的 C 库交互)。
编辑:回应评论,平台是“Linux-3.0.0-14-generic-x86_64-with-Ubuntu-11.10-oneiric”。现在,如果numpy.float128
精度随平台不同而变化,那对我来说也是有用的知识!
需要明确的是,我感兴趣的是精度,而不是元素的大小。
解决方案 1:
numpy.longdouble
指的是 C 编译器调用的任何类型long double
。目前,这是numpy 支持的唯一扩展精度浮点类型。
在 x86-32 和 x86-64 上,这是一个80 位浮点类型。在更奇特的系统上,它可能是其他类型(据我所知,在 Sparc 上它实际上是 128 位 IEEE 浮点数,而在 PPC 上它是双精度浮点数)。(它也可能取决于您使用的操作系统和编译器——例如,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
。或者更好的是,除非您有真正令人信服的理由,否则最好坚持使用双打。它们会更快、更便携等。
解决方案 2:
强烈建议使用它longdouble
来代替 float128,因为 ATM 相当混乱float64
。Python 将在初始化期间将其转换为。
在 numpy 中,它可以是 double 或 long double。它在您的平台中定义npy_common.h
并取决于您的平台。我不知道您是否可以将其开箱即用地包含在您的源代码中。
如果您不需要算法的这一部分的性能,那么更安全的方法是将其导出为字符串并strold
在之后使用。
解决方案 3:
来自numpy 文档的 TLDR :
np.longdouble
填充为系统默认值;np.float96
并且np.float128
提供给需要特定填充的用户。尽管名称不同,np.float96
并且np.float128
仅提供与一样的精度np.longdouble
,即在大多数 x86 机器上为 80 位,在标准 Windows 版本中为 64 位。