为什么这个while循环不会陷入无限循环?

时间:2019-09-10 15:36:57

标签: python

当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))

3 个答案:

答案 0 :(得分:4)

浮点数的精度是有限的;特别是,在获得接近于0的值以至于0是最接近的近似值之前,您只能将其除以2多次。此时,1 + 0 < 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

答案 1 :(得分:2)

我相信您遇到的是浮点错误。

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

例如,经过1000次迭代:

x = -1.1665795231290236e-302

和:

1 + x < 1
>>>False

这只是用数字编程的限制。

答案 2 :(得分:-1)

每次迭代,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循环将中断。