如果print([a, b])
在循環中,你可以看到的範圍內演變:
[-4, 1]
[-1.5, 1]
[-1.5, -0.25]
[-1.5, -0.875]
[-1.1875, -0.875]
[-1.03125, -0.875]
...
...
...
[-1.0000000000000284, -0.9999999999999929]
[-1.0000000000000107, -0.9999999999999929]
[-1.0000000000000018, -0.9999999999999929]
[-1.0000000000000018, -0.9999999999999973]
[-1.0000000000000018, -0.9999999999999996]
[-1.0000000000000007, -0.9999999999999996]
的-1.0000000000000007和-0.9999999999999996計算的平均值正好是-1。爲什麼?因爲你已經達到了浮點數可以表示的極限。這裏所涉及的確切值:
>>> '%.60f' % -1.0000000000000007
'-1.000000000000000666133814775093924254179000854492187500000000'
>>> '%.60f' % -0.9999999999999996
'-0.999999999999999555910790149937383830547332763671875000000000'
>>> '%.60f' % (-1.0000000000000007 + -0.9999999999999996)
'-2.000000000000000000000000000000000000000000000000000000000000'
>>> '%.60f' % ((-1.0000000000000007 + -0.9999999999999996)/2)
'-1.000000000000000000000000000000000000000000000000000000000000'
花車店52 bits of fraction,領先1位後,意味着52位。這意味着你失去了小於你的價值的大約1/2 。經過52個步驟後,您的初始尺寸爲5的尺寸約爲5/2 。這就是你的價值-1的1/2 。因此,在那裏,由於不精確性,你很可能會偶然發現-1。
它可能需要兩個或更多三個步驟,因爲5/2 仍然大於1/2 。你在那裏很幸運。與你的其他初始範圍[-2, 1]
你只是沒有幸運。在你達到-1之前,你的範圍縮小到[-1.0000000000000002, -0.9999999999999999]
。
如果您從[-4000000, 1]
開始,那麼您需要72步。它多20步,因爲初始範圍是百萬倍大,約爲2 。
另一種情況:如果您使用功能x**2 - 1000000
和初始範圍[999.3, 1000.3]
,則需要41個步驟。爲什麼?最終值(即根)爲1000,初始範圍爲1,即1/1000,因此大約爲1/2 。所以要到1/2 你只需要大約42個二等分。
你有沒有至少讀過二分法背後的理論,換句話說,你知道你的代碼發生了什麼嗎? – nbro
恩,你鏈接到的頁面上接受的答案*是*使用for-loop,否? –
誰投票結束這個問題根本不理解這個話題。他/她問的很清楚。 – nbro