2009-11-22 41 views
2

我遇到了奇怪的事情,在這裏,我很茫然 - 我有一種感覺,這與浮動精度有關,但我很驚訝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是罪魁禍首。

+1

你可以使用圓我不確定混淆的地方。 int()接受數字的和絃部分並作爲結果產生。正如你所觀察到的,相對精度的浮點數學就是這樣。 – 2009-11-22 08:21:59

+1

呃,我怎麼錯了。它需要「全部」部分並完全丟棄派系部分。 – 2009-11-22 08:23:07

+0

@pst:仔細閱讀。 '__str__'欺騙了我,認爲'c'實際上不是'> = 345.0',有近似誤差。因此,我預計'int(c)'是'345',而不是'344'。這只是__str__在凌晨3點24分對我越來越好,我也不完全確定你的困惑在哪裏? – 2009-11-22 08:24:38

回答

4

這是通過使用c.__str__()(又名str(c)):

print "c is", c 

這是通過使用c.__repr__()(又名repr(c)):

>>> C# In the Python shell 

IIRC,__str__截斷到10位小數,而__repr__更進一步。要獲得相同的行爲在Python外殼,你可以這樣做:

print repr(c) 
# Or 
print "%r" % c 
# Or 
print "%.16f" % c 

你在郵件中談論的變化僅僅是關於Python 3.1和不改變輸出的精度:蓋伊的算法在Python 3.1中的浮點數上使用__repr__時,如果給出了兩個表示選項,它們產生相同的浮點值(如0.20.2000000000000001),請選擇最短的一個。小數點後

+0

啊,謝謝你澄清變化,以及。當你閱讀一些可能與遠程相關的東西時,你是不是討厭它,把它歸檔,然後你的長期記憶開始發展*嘿!嘿!我知道!*但你不記得爲什麼? – 2009-11-22 08:27:05

0
print "c is", int(c) 

的整數轉換將簡單地丟棄任何東西,所以即使你有344.99999999999989它將始終向下取整。 你可以使用舊學校打印%

print'c is %5.0f' % c 

,或者如果你想要一個整數

print'c is %d' % round(c,0) 

您可能也有興趣在其他解決方案的立方根問題 here

+1

如果你想減去至少說明原因 – 10ToedSloth 2009-11-22 09:05:15

+0

乾杯克雷格,但仍然對投票感到好奇。想知道爲什麼有人認爲我的回答太離譜了。所以如果任何人有一些建設性的批評,它的讚賞。 – 10ToedSloth 2009-11-22 09:16:56

+0

我是那個低估的人:你的回答沒有帶來任何OP不知道的問題,問題是關於'str'等的精確度,而不是關於OP似乎知道的浮點算術。 – 2009-11-22 09:47:33