gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:31:35 24 4
gpt4 key购买 nike

这其实不是问题,更多的是对浮点运算在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

似乎 1 除以一个接近于零的数是 inf 并且如果它更接近于 ZeroDivisionError 则被抛出。这似乎是一种奇怪的行为。

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


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

最佳答案

这与 IEEE754 浮点格式本身有关,与 Python 的实现无关。

一般来说,由于 denormal numbers, float 可以表示较小的负指数而不是较大的正指数。 .这是 float 的尾数部分不再隐含地假定以 1 开头,而是描述整个尾数,并以零开头的地方。如果您不知道那是什么,我建议您阅读有关 float 的表示方式,也许从 here 开始。 .

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

1e-324 的情况下,这个数字太小了,甚至不能表示为非正规数,因此 float 文字实际上等于零。这就是为什么你被零除的原因。最小的可表示 64 位 float 是(略低于)5e-324

关于python - 为什么接近于零的除法在 python 中有不同的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35400114/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com