【发布时间】:2023-02-02 19:06:19
【问题描述】:
我正在使用Python 3.10并且我有:
a = int(2 ** 1023 * (1 + (1 - 2 ** -52)))
现在,a的值是double precision floating point format中的最大整数值。
所以,我期待 float(a + 1) 给出 OverflowError 错误,如 here 中所述:
如果参数超出 Python 浮点数的范围,则会引发 OverflowError。
但是,令我惊讶的是,它并没有抛出错误,而是愉快地返回
1.7976931348623157e+308看起来像
sys.float_info.max我也做
float(a + 2)、float(a + 3)、float(a + 4)等,但它仍然返回1.7976931348623157e+308。只有在我执行float(a + a)之后它才会抛出预期的异常:Traceback (most recent call last): File "<stdin>", line 1, in <module> OverflowError: int too large to convert to float那么,这可能是什么原因呢?
【问题讨论】:
-
对我来说,它在 a+a 之前抛出。
-
@KellyBundy 我只查看
float(a + 10)。我的观点不是关于k在float(a + k)中有多大,而是为什么它不针对每个k >= 1抛出。 -
是的,但它似乎在 a+(a>>53) 附近开始失败,这可能会提供一些见解。
-
可能是由可变浮点密度引起的:在 0 附近非常高,并且在“间隔边缘”附近非常低,其中在 2 个“连续”值之间(仅相差最低有效位- 尾数)有一个巨大的差距。
-
对我来说失败的最小自然数:
a + 2**970
标签: python floating-point