我遇到了奇怪的事情,在這裏,我很茫然 - 我有一種感覺,這與浮動精度有關,但我很驚訝Python不會顯示逼近錯誤,如果是這樣的話。Python沒有顯示出這個數字的精度嗎?
我正在做Project Euler problem 62。作爲一個簡單的測試(我已經使用不同的方法解決了),我有一個is_cube
,我打算檢查一個數字是否完美。所以,要儘量樣品給予,我這樣做:
def is_cube(i):
c = i ** (1./3)
print "c is", c
當我跑這其中i = 41063625,預期輸出是:
c is 345.0
在此處,意想不到的事情發生:
def is_cube(i):
c = i ** (1./3)
print "c is", int(c)
突然間,我有這樣的:
c is 344
值c
不會與我的345.0
字面值相比較,要麼 - c < 345.0
爲真。
Python沒有顯示出這個數字的精度嗎?我似乎回想起有關更改的讀物,使得浮印在印刷時顯得更爲理智。是這個嗎?這兩種情況有什麼不同?
>>> def is_cube(i):
... c = i ** (1./3)
... print "c is", c
...
>>> is_cube(41063625)
c is 345.0
>>> 41063625 ** (1./3)
344.99999999999989
編輯:仍然有窗口打開,這樣做,:
>>> print _
345.0
現在,我開始覺得我應該知道所有沿print
是罪魁禍首。
你可以使用圓我不確定混淆的地方。 int()接受數字的和絃部分並作爲結果產生。正如你所觀察到的,相對精度的浮點數學就是這樣。 – 2009-11-22 08:21:59
呃,我怎麼錯了。它需要「全部」部分並完全丟棄派系部分。 – 2009-11-22 08:23:07
@pst:仔細閱讀。 '__str__'欺騙了我,認爲'c'實際上不是'> = 345.0',有近似誤差。因此,我預計'int(c)'是'345',而不是'344'。這只是__str__在凌晨3點24分對我越來越好,我也不完全確定你的困惑在哪裏? – 2009-11-22 08:24:38