为啥numpy的float128只有63位尾数? [复制]

Posted

技术标签:

【中文标题】为啥numpy的float128只有63位尾数? [复制]【英文标题】:Why does numpy's float128 only have 63 bits mantissa? [duplicate]为什么numpy的float128只有63位尾数? [复制] 【发布时间】:2019-03-11 06:52:24 【问题描述】:

我确定这是一个愚蠢的问题,但我真的很困惑:

>>> import numpy as np
>>> 
>>> f1, f2, f64 = map(np.float128, (1, 2, -64))
>>> f1 + f2**f64 == f1
True

或者更直接:

>>> np.finfo(np.float128).nmant
63

指数似乎有 15 位,那么这些缺失的位在哪里?

【问题讨论】:

@juanpa.arrivillaga 这应该是我想说的答案。 @juanpa.arrivillaga 是的,阅读文档确实有帮助...愿意回答吗? 另见以前的答案***.com/a/17023995/175320。你不是第一个对此感到困惑的人。 【参考方案1】:

阅读the docs:

np.longdouble 填充为系统默认值; np.float96 和 np.float128 是为需要特定填充的用户提供的。尽管 在名称中,np.float96 和 np.float128 仅提供同样多的名称 精度为 np.longdouble,即大多数 x86 机器上的 80 位和 标准 Windows 版本中的 64 位。

所以看起来它不会真正使用所有这些位。我想,如果我们在 x86 架构上假设 80 位(我也有),它不会考虑丢失的两位,15 + 63 = 78。

【讨论】:

1 位用于符号,1 位可能用于尾数中最显着的 1(通常)(在“常规”IEEE754 binary32 和 binary64 类型中不存在,因为它隐含 1总是除了次正规数)。

以上是关于为啥numpy的float128只有63位尾数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

第3课 浮点数的秘密

为啥C语言中用float类型进行较大值的运算会丢失较多精度

单精度浮点数(float)加法计算出错

numpy.float128 在 windows 中不存在,但从 OpenGL 调用

c++中,float double区别

float的取值范围怎么计算