为什么接近零的除法在 python 中有不同的行为?
Why does division near to zero have different behaviors in python?
这实际上不是问题,更多的是对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. This is where the mantissa part of the float is no longer implicitly assumed to begin with a 1, but rather describes the entire mantissa, and begins with zeroes. In case you don't know what that is, I'd suggest you read up about how floats are represented, perhaps starting here。
正因为如此,当你反转一个非正规数时,你最终可能会得到一个太大而无法表示的正指数。然后计算机会给你 inf
代替它。您示例中的 1e-308
实际上也是非正规的,但倒数时仍然不小而溢出(因为在正常数字中,标准实际上允许正指数略大于负指数)。
在 1e-324
的情况下,这个数字太小了,即使是非正规数也无法表示,因此浮点数实际上等于零。这就是为什么你被零除的原因。最小的可表示 64 位浮点数是(略低于)5e-324
.
Python 中可用作浮点数的最小值是:
2.2250738585072014e-308
Python 使用双精度浮点数,它可以保存从大约 10 到 -308 到 10 到 308 次方的值。
Wikipedia - double precision floating point format
实际上,您可能可以通过 denormals 获得小于 1e-308 的数字,但这会对性能造成重大影响。我发现 Python 能够处理 1e-324
但在 1e-325
和 returns 0.0
上下溢作为值。
Dolda2000 在他的 中已经解释了大部分内容。然而,查看 这可能会有所帮助。
>>> 1e-308
1e-308
>>> 1e-309
1e-309
>>> 1e-323
1e-323
>>> 1e-324
0.0
如您所见,1e-324
在 python 实现中等于 0.0
。正如 Dolda2000 所说得非常好:这个数字太小了,即使是非正规数也无法表示,因此浮点数实际上等于零
这实际上不是问题,更多的是对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. This is where the mantissa part of the float is no longer implicitly assumed to begin with a 1, but rather describes the entire mantissa, and begins with zeroes. In case you don't know what that is, I'd suggest you read up about how floats are represented, perhaps starting here。
正因为如此,当你反转一个非正规数时,你最终可能会得到一个太大而无法表示的正指数。然后计算机会给你 inf
代替它。您示例中的 1e-308
实际上也是非正规的,但倒数时仍然不小而溢出(因为在正常数字中,标准实际上允许正指数略大于负指数)。
在 1e-324
的情况下,这个数字太小了,即使是非正规数也无法表示,因此浮点数实际上等于零。这就是为什么你被零除的原因。最小的可表示 64 位浮点数是(略低于)5e-324
.
Python 中可用作浮点数的最小值是:
2.2250738585072014e-308
Python 使用双精度浮点数,它可以保存从大约 10 到 -308 到 10 到 308 次方的值。
Wikipedia - double precision floating point format
实际上,您可能可以通过 denormals 获得小于 1e-308 的数字,但这会对性能造成重大影响。我发现 Python 能够处理 1e-324
但在 1e-325
和 returns 0.0
上下溢作为值。
Dolda2000 在他的
>>> 1e-308
1e-308
>>> 1e-309
1e-309
>>> 1e-323
1e-323
>>> 1e-324
0.0
如您所见,1e-324
在 python 实现中等于 0.0
。正如 Dolda2000 所说得非常好:这个数字太小了,即使是非正规数也无法表示,因此浮点数实际上等于零