numpy.float128在内部映射到什么精度?是__float128还是长双?(或完全不同的东西!?)
如果有人知道,可能会有一个问题:在C中将__float128强制转换为(16字节)长的双精度是否安全?(这是为了与长双打的C lib接口).
编辑:响应评论,该平台是'Linux-3.0.0-14-generic-x86_64-with-Ubuntu-11.10-oneiric'.现在,如果numpy.float128具有依赖于平台的不同精度,那对我来说也是有用的知识!
需要明确的是,这是我感兴趣的精度,而不是元素的大小.
Nat*_*ith 39
numpy.longdouble
指C编译器调用的任何类型long double
.目前,这是numpy支持的唯一扩展精度浮点类型.
在x86-32和x86-64上,这是一个80位浮点类型.在更奇特的系统上它可能是其他东西(Sparc上的IIRC它是一个实际的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
.或者更好的是坚持双打,除非你有一个真正令人信服的理由.它们会更快,更便携等.
非常建议使用longdouble而不是float128,因为ATM 非常混乱.Python将在初始化期间将其强制转换为float64.
在numpy里面,它可以是双倍或长双.它在npy_common.h中定义,取决于您的平台.我不知道你是否可以在开源代码中将它包含在你的源代码中.
如果您在算法的这一部分中不需要性能,则更安全的方法是将其导出为字符串并在之后使用漫步.
来自numpy 文档的 TLDR :
np.longdouble
填充为系统默认值;np.float96
并np.float128
为需要特定填充的用户提供。不管名称如何,np.float96
和np.float128
只提供与 一样多的精度np.longdouble
,即在大多数 x86 机器上为 80 位,在标准 Windows 版本中为 64 位。
归档时间: |
|
查看次数: |
17020 次 |
最近记录: |