猿问

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

numpy.float128内部映射到什么精度?是__float128还是长双倍?(或完全其他!!)


如果有人知道,这个问题可能会引起关注:在C中将__float128转换为(16字节)长的双精度数,而只是精度下降,是否安全?(这是为了与在长双精度上运行的C lib接口)。


编辑:作为回应,该平台是“ Linux-3.0.0-14-generic-x86_64-with-Ubuntu-11.10-oneiric”。现在,如果numpy.float128的精度取决于平台,则对我来说也是有用的知识!


需要明确的是,这是我感兴趣的精度,而不是元素的大小。


慕森王
浏览 1547回答 2
2回答

青春有我

强烈建议使用longdouble而不是float128,因为这很混乱,ATM。Python将在初始化期间将其强制转换为float64。在numpy内部,它可以是双精度型或长双精度型。它在npy_common.h中定义,取决于您的平台。我不知道您是否可以将其直接包含在源代码中。如果您在算法的这一部分中不需要性能,一种更安全的方法可能是将其导出为字符串,然后使用strold。

交互式爱情

numpy.longdouble指的是C编译器调用的任何类型long double。当前,这是numpy支持的唯一扩展精度浮点类型。在x86-32和x86-64上,这是一种80位浮点类型。在更特殊的系统上,可能还有别的东西(在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位,但为了保持32位对齐而被填充多达96位,并且numpy将其称为float96。在x86-64上,它long double仍然是相同的80位类型,但现在它被填充至128位以保持64位对齐,并且numpy将此称为float128。没有额外的精度,只有额外的填充。建议:忽略float96/ float128名称,只需使用即可numpy.longdouble。或者,除非您有真正令人信服的理由,否则最好坚持加倍。它们将更快,更便携等。
随时随地看视频慕课网APP
我要回答