更多 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_float
s 打印为 "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 位。额外的数字不携带任何附加信息,并且看起来数字已损坏。
我正在使用 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_float
s 打印为"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 位。额外的数字不携带任何附加信息,并且看起来数字已损坏。