numpy.float128
内部映射到什么精度?是__float128
还是长双人间?或者完全是别的什么?
如果有人知道的话,一个潜在的问题是:在C中,将一个__float128
转换成一个(16字节)长的双倍,在精度上只会有损失,这是安全的吗?(这是为了与在长双上运行的C库进行接口)。
编辑:作为对评论的回应,平台是'Linux-3.0.0-14-generic-x86_64-with-Ubuntu-11.10-oneiric'.现在,如果numpy.float128
有不同的精度依赖于平台,那对我也是有用的知识!
要明确的是,这是我感兴趣的精确性,而不是元素的大小。
发布于 2012-01-30 12:45:24
我们非常推荐使用而不是float128,因为它是乱七八糟,ATM。Python将在初始化期间将其转换为float64
。
它可以是双倍,也可以是长双倍。它是在npy_common.h
中定义的,取决于您的平台。我不知道你是否可以把它写进你的源代码中。
如果在算法的这一部分中不需要性能,更安全的方法可能是将其导出到字符串中,然后使用strold
。
发布于 2013-06-10 12:33:05
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位,但是为了保持32位对齐,可以得到高达96位的填充,numpy调用这个float96
。在x86-64上,long double
又是相同的80位类型,但是现在它被填充到128位来保持64位对齐,numpy调用这个float128
。没有额外的精度,只有额外的填充。
建议:忽略float96
/float128
名称,只需使用numpy.longdouble
。或者最好还是坚持双倍,除非你有一个真正令人信服的理由。它们会更快,更便携,等等。
发布于 2021-07-26 19:11:39
来自矮胖的医生的TLDR
np.longdouble
被填充到系统默认值;np.float96
和np.float128
提供给想要特定填充的用户。尽管有这些名称,但np.float96
和np.float128
只提供与np.longdouble
相同的精度,即在大多数x86机器上提供80位,在标准Windows中提供64位。
https://stackoverflow.com/questions/9062562
复制相似问题