更多cttypes c_float()精度

时间:2015-06-01 11:05:39

标签: python floating-point ctypes floating-accuracy

我正在使用Python的ctypes库来调用我的C代码。我的问题是,当我尝试创建c_float时,我似乎获得的值与我设置的值略有不同。

例如

print(value)
print(c_float(value))

0.2
c_float(0.20000...298...)

我该如何避免这种情况?

3 个答案:

答案 0 :(得分:3)

JanRüegg是对的 - 这就是浮动的工作方式。

如果您想知道为什么这只出现c_float,那是因为

  • c_float打印为"c_float({!r}).format(self.value)self.value double -precision Python float。

  • Python的float类型打印转换为浮点数的最短表示,因此尽管float(0.2)不精确,但它仍然可以以简短形式打印

c_float(0.2)中的不准确度足以使其更接近

0.20000000298023223876953125

而不是

0.200000000000000011102230246251565404236316680908203125

由于float(0.2)代表后者,因此无法使用"0.2"的缩写形式。

答案 1 :(得分:1)

Python的float对应于C double,通常为64位宽。另一方面,ctypes c_float对应于C float,通常为32位宽。这就是为什么你观察到精度下降的原因 - 当用较窄的类型表示不精确的数字时,它是预期的。

c_float的__repr__通过将数字转换回Python float以便打印它而增加了混乱,因此其输出包含额外的不必要的数字。 32位浮点数可以使用9位有效数字打印,而64位浮点数则需要17位。额外数字不附带任何其他信息,并使其看起来像数字已损坏。

答案 2 :(得分:0)

浮点数具有固定的精度,并不一定能精确地表示十进制表示的有限数。

this website上,您可以看到浮点数实际存储在内存中的方式。如果在“十进制表示”中输入“0.2”,则可以看到它如何转换为十六进制数,并且存储的数字正是您注意到的数字。