为什么接近零的除法在python中有不同的行为?

ema*_*lli 5 python floating-point division

这实际上不是一个问题,它更多的是对Python实现的浮点运算感到好奇.

有人可以解释以下行为吗?

>>> 1/1e-308
1e+308
>>> 1/1e-309
inf
>>> 1/1e-323
inf
>>> 1/1e-324
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: float division by zero
Run Code Online (Sandbox Code Playgroud)

似乎1除以接近零的数字,inf并且如果它更接近a ZeroDivisionError被抛出.这似乎是一种奇怪的行为.

python 2.x/3.x的输出相同.


编辑:我的主要问题是为什么我们得到inf一些范围而不是ZeroDivisionError假设python似乎认为是零1e-309

Dol*_*000 7

这与IEEE754浮点格式本身有关,而不是Python的实现.

一般来说,浮点数可以代表较小的负指数而不是大的正指数,因为非正规数.这是浮点的尾数部分不再隐含地假设以1开始,而是描述整个尾数,并以零开始.如果你不知道那是什么,我建议你读一下浮点数是如何表示的,也许从这里开始.

因此,当您反转非正规数时,最终可能会得到一个太大而无法表示的正指数.然后计算机就能inf代替您.该1e-308在你的例子其实也是非正规,但还是不小的倒立时(因为正常的数字中,该标准实际上允许比负指数稍大正)溢出.

在这种情况下1e-324,该数字太小而不能表示为非正规数,因此浮点字面值实际上等于零.这就是为什么你得到除零的原因.最小的可表示的64位浮点数(略低于)5e-324.