我正在使用Python的ctypes
库来调用我的C代码。我的问题是,当我尝试创建c_float
时,我似乎获得的值与我设置的值略有不同。
例如
print(value)
print(c_float(value))
0.2
c_float(0.20000...298...)
我该如何避免这种情况?
答案 0 :(得分:3)
如果您想知道为什么这只出现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”,则可以看到它如何转换为十六进制数,并且存储的数字正是您注意到的数字。