2012-01-21 68 views
0

我正在使用SWIG將我的C++代碼封裝到Python中。但浮點數的轉換很奇怪。 例如,如果我在PythonC++浮點到Python float錯誤轉換

>>> import mymodule 
>>> mymodule.foo() 
62.02000045776367 
>>> 

具有低於函數(用C++編寫)

float foo() { 
    float x=62.02; 
    return x; 
} 

並執行它(與SWIG包裝後)它返回62.02000045776367代替62.02

有沒有辦法告訴SWIG如何進行正確的轉換?

回答

4

除無損float - >double轉換,沒有轉換正在進行。

62.02不能完全表示爲C float。當你做float x=62.02時,變量將包含你提到的值。

我強烈推薦閱讀What Every Computer Scientist Should Know About Floating-Point Arithmetic

+0

這是一個愚蠢的問題。我沒有注意到我使用了錯誤的類型。使用'double'解決了所有問題。謝謝大家!!! –

+3

@CaioS。,仍然閱讀鏈接。這不僅僅是一個「float」與「double」問題,而且是許多編程語言的一個非常基礎的方面。 –

5

這是正確的轉換,它只是不能用float精確地表示小數點62.02,很像您無法用十進制表示小數點2/3

你可以看到一點多用這種短代碼,在那裏你會看到當你存儲62.02既是floatdouble什麼C++看到:http://ideone.com/HvfZb

+0

但有一種方法可以在Python中獲得精確的值嗎? –

+1

另請注意,Python的float類型對應於C++中的double類型。由於浮動轉換爲雙倍,您會看到精度上的差異。 – casevh

+2

@Caio:那*是* C的精確值。它從來沒有「62.02」。 –