【发布时间】:2016-06-21 02:52:04
【问题描述】:
在 x64 上的 Python 2.7.9 上,我看到以下行为:
>>> float("10"*(2**28))
inf
>>> float("10"*(2**29))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: 10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010
>>> float("0"*(2**33))
0.0
>>> float("0." + "0"*(2**32))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
除非有一些更深层次的理由,否则我错过了这违反了最少的惊喜。当我在 "10"*(2**29) 上得到 ValueError 时,我认为这只是对非常长的字符串的限制,但随后 "0"*(2**33) 起作用了。这是怎么回事?谁能证明为什么这种行为不是 POLA 错误(如果可能是一个相对无关的错误)?
【问题讨论】:
-
可能是因为解析器在尝试将剩余数字转换为浮点值之前忽略了所有前导零?
-
我无法重现这个,但那是因为我的系统转储核心试图创建 512MiB
'10101010...'字符串。您是否尝试过将字符串创建为单独的步骤(s = '10' * (2 ** 29)或其他)并然后转换为float(s)?len(s)的输出也可能提供信息。 -
顺便说一句:since Python 3.2,“如果参数超出 Python 浮点数的范围,将引发
OverflowError。” Python 2 和更早版本的 Python 3 没有解决这个问题,只是说,“当传入字符串时,可能会返回 NaN 和 Infinity 的值,具体取决于底层 C 库。”
标签: python