比较大数时的不直观行为
Unintuitive behavior when comparing large numbers
刚刚在参加 Google CodeJam 比赛时发现了一些不符合直觉的行为。
input: pow(10, 20) in [pow(10, 20) * 1.0]
output: True
(好的...)
input: pow(10, 30) in [pow(10, 30) * 1.0]
output: False
(???????????)
(所以,这个行为取决于数字的大小?!)
(这是因为 Python 大整数在幕后的表示方式不同吗?)
input: True == True
output: False
(ok,一切正常)
input: pow(10, 20) in [pow(10, 20) * 1.0] == pow(10, 20) in [pow(10, 20) * 1.0]
输出:假
(更多??????)
input: pow(10, 20) in [pow(10, 20) * 1.0] and pow(10, 20) in [pow(10, 20) * 1.0]
输出:真
(我完全迷路了)
这是因为浮点数,也因为 python 处理涉及整数时求幂结果的方式:
>>> type(pow(10,30))
<class 'int'>
pow
运算符将结果保持为整数。
现在,如果您乘以 1.0
,您会强制将表示更改为 float
,然后,使用 30 的指数,精度不足以与与整数相同的值进行比较.
无关但为了完整回答您的问题,==
的奇怪行为无关:这是 operator chaining 的问题。使用一组括号不会造成伤害并解决您的问题:
>>> pow(10, 20) in [pow(10, 20) * 1.0] == pow(10, 20) in [pow(10, 20) * 1.0]
False
>>> (pow(10, 20) in [pow(10, 20) * 1.0]) == (pow(10, 20) in [pow(10, 20) * 1.0])
True
>>>
刚刚在参加 Google CodeJam 比赛时发现了一些不符合直觉的行为。
input: pow(10, 20) in [pow(10, 20) * 1.0]
output: True
(好的...)
input: pow(10, 30) in [pow(10, 30) * 1.0]
output: False
(???????????)
(所以,这个行为取决于数字的大小?!)
(这是因为 Python 大整数在幕后的表示方式不同吗?)
input: True == True
output: False
(ok,一切正常)
input: pow(10, 20) in [pow(10, 20) * 1.0] == pow(10, 20) in [pow(10, 20) * 1.0]
输出:假
(更多??????)
input: pow(10, 20) in [pow(10, 20) * 1.0] and pow(10, 20) in [pow(10, 20) * 1.0]
输出:真
(我完全迷路了)
这是因为浮点数,也因为 python 处理涉及整数时求幂结果的方式:
>>> type(pow(10,30))
<class 'int'>
pow
运算符将结果保持为整数。
现在,如果您乘以 1.0
,您会强制将表示更改为 float
,然后,使用 30 的指数,精度不足以与与整数相同的值进行比较.
无关但为了完整回答您的问题,==
的奇怪行为无关:这是 operator chaining 的问题。使用一组括号不会造成伤害并解决您的问题:
>>> pow(10, 20) in [pow(10, 20) * 1.0] == pow(10, 20) in [pow(10, 20) * 1.0]
False
>>> (pow(10, 20) in [pow(10, 20) * 1.0]) == (pow(10, 20) in [pow(10, 20) * 1.0])
True
>>>