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

Hen*_*all 25 c python numpy

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.或者更好的是坚持双打,除非你有一个真正令人信服的理由.它们会更快,更便携等.

  • 也供那些进行复杂操作的人参考。有一个“numpy.longcomplex”。 (2认同)

Cor*_*ren 9

非常建议使用longdouble而不是float128,因为ATM 非常混乱.Python将在初始化期间将其强制转换为float64.

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

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

  • 将指向 float128 数组的指针转换为 long double 是否正确地位于内存中?它*是*性能关键;) (2认同)

Sup*_*mer 6

来自numpy 文档的 TLDR :

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