【问题标题】:Why this while loop will not get stuck in an infinite loop?为什么这个while循环不会陷入无限循环?
【发布时间】:2019-09-11 16:36:25
【问题描述】:

当x = -1时,为什么这个函数不会陷入死循环?

如果 x = -1,它将返回 2.0 作为结果。

def fun_B(x):
    total = 0
    while 1 + x < 1:
        total = total + x
        x = x / 2
    return total
print(fun_B(-1))

【问题讨论】:

  • 解释为什么你认为它应该是一个无限循环。
  • while 1 + (x &lt; 1): 将是该调用的无限循环
  • 你尝试过什么来调试这个问题?为什么不在每次迭代中检查 x 包含的内容

标签: python


【解决方案1】:

浮点数具有有限的精度;特别是,在得到一个如此接近 0 的值之前,您只能除以 2 多次,以至于 0 是最接近的近似值。此时,1 + 0 &lt; 1 为假。

>>> while 1 + x < 1:
...   print(x)
...   x = x / 2
...
-1
-0.5
-0.25
-0.125
-0.0625
-0.03125
-0.015625
-0.0078125
-0.00390625
-0.001953125
-0.0009765625
-0.00048828125
-0.000244140625
-0.0001220703125
-6.103515625e-05
-3.0517578125e-05
-1.52587890625e-05
-7.62939453125e-06
-3.814697265625e-06
-1.9073486328125e-06
-9.5367431640625e-07
-4.76837158203125e-07
-2.384185791015625e-07
-1.1920928955078125e-07
-5.960464477539063e-08
-2.9802322387695312e-08
-1.4901161193847656e-08
-7.450580596923828e-09
-3.725290298461914e-09
-1.862645149230957e-09
-9.313225746154785e-10
-4.656612873077393e-10
-2.3283064365386963e-10
-1.1641532182693481e-10
-5.820766091346741e-11
-2.9103830456733704e-11
-1.4551915228366852e-11
-7.275957614183426e-12
-3.637978807091713e-12
-1.8189894035458565e-12
-9.094947017729282e-13
-4.547473508864641e-13
-2.2737367544323206e-13
-1.1368683772161603e-13
-5.684341886080802e-14
-2.842170943040401e-14
-1.4210854715202004e-14
-7.105427357601002e-15
-3.552713678800501e-15
-1.7763568394002505e-15
-8.881784197001252e-16
-4.440892098500626e-16
-2.220446049250313e-16
-1.1102230246251565e-16

【讨论】:

    【解决方案2】:

    我相信您遇到了浮点错误。

    经过大量的迭代后,x 会变得如此之小,以至于 python 很难将它与根本没有变化区分开来。

    例如,1000 次迭代后:

    x = -1.1665795231290236e-302
    

    和:

    1 + x < 1
    >>>False
    

    这只是数字编程的一个限制。

    【讨论】:

    • 它发生在远少于 1000 次迭代中。
    • True,因此是“例如”:p。只是在里面扔了一个我知道会导致问题的数字。
    【解决方案3】:

    每次迭代,x 都会接近 0:

    x -1
    total 0
    x -0.5
    total -1
    x -0.25
    total -1.5
    x -0.125
    total -1.75
    x -0.0625
    total -1.875
    x -0.03125
    total -1.9375
    x -0.015625
    total -1.96875
    x -0.0078125
    total -1.984375
    x -0.00390625
    total -1.9921875
    x -0.001953125
    total -1.99609375
    x -0.0009765625
    ...
    

    最终,x 将变得如此接近 0,python 无法区分,此时 while 循环将中断。

    【讨论】:

    • 糟糕,我的意思是说 x 将变得如此接近 0 - 相应地编辑了我的答案
    猜你喜欢
    • 2019-12-23
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 2010-11-01
    • 2016-07-27
    • 2022-08-19
    • 2020-04-02
    相关资源
    最近更新 更多