更多 cttypes c_float() 精度

More cttypes c_float() precision

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

例如

print(value)
print(c_float(value))

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

我怎样才能避免这种情况?

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

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

Jan Rüegg 是对的 - 这就是花车的工作原理。

如果您想知道为什么只显示 c_float,那是因为

  • c_floats 打印为 "c_float({!r}).format(self.value)self.value 是一个 双精度 精度 Python 浮点数。

  • Python的float类型打印出转换为浮点数的最短表示,所以虽然float(0.2) 不准确,它仍然可以短格式打印。

c_float(0.2) 中的不准确性足够高,使其更接近

0.20000000298023223876953125

0.200000000000000011102230246251565404236316680908203125

由于float(0.2)代表后者,不能使用"0.2"的缩写

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

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