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
这与IEEE754浮点格式本身有关,而不是Python的实现.
一般来说,浮点数可以代表较小的负指数而不是大的正指数,因为非正规数.这是浮点的尾数部分不再隐含地假设以1开始,而是描述整个尾数,并以零开始.如果你不知道那是什么,我建议你读一下浮点数是如何表示的,也许从这里开始.
因此,当您反转非正规数时,最终可能会得到一个太大而无法表示的正指数.然后计算机就能inf
代替您.该1e-308
在你的例子其实也是非正规,但还是不小的倒立时(因为正常的数字中,该标准实际上允许比负指数稍大正)溢出.
在这种情况下1e-324
,该数字太小而不能表示为非正规数,因此浮点字面值实际上等于零.这就是为什么你得到除零的原因.最小的可表示的64位浮点数(略低于)5e-324
.