2012-01-21 50 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”。 –