2 回答
TA贡献1784条经验 获得超8个赞
强烈建议使用longdouble而不是float128,因为这很混乱,ATM。Python将在初始化期间将其强制转换为float64。
在numpy内部,它可以是双精度型或长双精度型。它在npy_common.h中定义,取决于您的平台。我不知道您是否可以将其直接包含在源代码中。
如果您在算法的这一部分中不需要性能,一种更安全的方法可能是将其导出为字符串,然后使用strold。
TA贡献1712条经验 获得超3个赞
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。或者,除非您有真正令人信服的理由,否则最好坚持加倍。它们将更快,更便携等。
添加回答
举报