【问题标题】:Unintuitive behavior when comparing large numbers比较大数时的不直观行为
【发布时间】:2019-04-08 05:41:32
【问题描述】:

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

输出:假

(更多??????)

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

输出:真

(我完全迷路了)

【问题讨论】:

  • 试试int(1e+30),你也会感到惊讶。

标签: python boolean floating-accuracy largenumber


【解决方案1】:

这是因为浮点数,也因为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
>>> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 2014-07-29
    • 1970-01-01
    相关资源
    最近更新 更多