比较大量数字时不直观

时间:2019-04-08 05:41:33

标签: python boolean floating-accuracy largenumber

在参加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

(好的,一切正常)

input: pow(10, 20) in [pow(10, 20) * 1.0] == pow(10, 20) in [pow(10, 20) * 1.0]

输出:False

(更多?????)

input: pow(10, 20) in [pow(10, 20) * 1.0] and pow(10, 20) in [pow(10, 20) * 1.0]

输出:正确

(我完全迷路了)

1 个答案:

答案 0 :(得分:5)

这是因为浮点,而且还因为涉及整数的情况下python处理幂运算结果的方式:

>>> type(pow(10,30))
<class 'int'>

pow运算符将结果保留为整数。

现在,如果乘以1.0,则迫使其将表示形式更改为float,然后使用30的指数,精度不足以与整数进行比较。< / p>

无关,但要完全回答您的问题,==的奇怪行为与之无关:这是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
>>>