Why does 2**-1025 != 0.0 in Python



根据IEEE754的规范,以64位编码的浮点值的指数为11位,尾数为52位。因此,可以编码为浮点的较小数字应该是2**(-2**10)。我相信维基百科页面是正确的,它给出了2**-1022的更精确的值,其十进制值大约为2.2250738585072014e-308

但是,使用Python,我可以使用诸如2**-1052之类的浮点数。我的计算机上的实际限制是2**-1074。从官方文档的这一页来看,Python通常符合IEEE754。

同时,最大值为2**1023,这是IEEE754标准给出的值。

  • 为什么会这样
  • 有人能解释吗
  • Python中浮点的实际编码是什么
  • 为什么指数的范围等于1074+1023+1,即2098,不是2的幂

首先,Python文档没有指定使用IEEE-754。浮点实现的选择取决于每个Python实现。IEEE-754非常流行,但并不普遍。

在IEEE-754基本64位二进制浮点格式(binary64)中,有一个1位符号字段s、一个11位指数字段e和一个52位主有效位字段1f(表示"分数")。

符号位为0表示正,为1表示负。

如果e都是一位(1111111111,或十进制2047),则对象表示无穷大(如果f为零)或NaN(如果f不为零)。("NaN"代表"不是数字")。

如果e既不是全零位也不是全一位,则它表示指数e=e−1023,并且f字段用于形成一个数字f,即1.f(即二进制数字"1."后跟f52位)。(等价地,如果我们将f视为二进制数字,我们可以说f=1+f•2−52。这些被称为正态数。

如果e都是零位,则它表示指数e=1−1023,并且f字段用于形成数字f,即0.f(即二进制数字"0",后跟f/em>的52位)。(等价地,我们可以说F=0+F•2−52。这些被称为次正规数。

请注意,e=1和e=0表示相同的指数e,1−1023=−1022,但将F的第一位从1更改为0F是浮点数的有效位(小数部分)。(人们有时将f称为有效位1,但这是不正确的。它只是提供数学有效位大部分编码的字段。如上所述,指数字段也有助于形成实际有效位f。)

最小的正数出现在s为零,e等于零,且f是1时(0000 0000 0000 0000)。则E=−1022且F=0+1•2−52,因此所表示的数字为(−1)0•2−1022·2−52=2−1074

s为零时,e是2046(11111111110),并且f都是1(1111111111111111111111111111111)时,出现最大的有限数E=2046−1023=1023。请注意,f,被解释为整数,是252−1,因此f=1+*(252−1)•21−52>=1+1−2<sup−52>=2-2>−52。因此,所表示的值为(−1)0•21023·(2-2−52)=21024−2971

脚注

1有效位有时被称为"尾数",但这是对数小数部分的旧术语。它并不完全适用于浮点数,因为尾数是对数的,而有效数是线性的。

binary64使用带偏指数和53位有效位对大多数值进行编码。

带偏指数为1或更大**时,值为:1._52_bit_encoded_"尾数"*2指数-偏

带偏指数为0时,值为:0。_52_bit_encoded_"尾数"*21-偏

OP对于正常值是正确的。但存在次正规值,其在0中具有不同数量的前导零。_52_bit_encoded_"尾数"。最小的非零则为0。(51_zeros)1*21-偏置或2-1074


**当有偏指数有一个最大值时,这个数字是特殊的:要么是无穷大,要么是非数字

最新更新