Python ctypes 精度

python ctypes precision

提问人:supvato 提问时间:10/12/2023 更新时间:10/12/2023 访问量:30

问:

我用来在 C++ 库 (.so) 上创建一个包装器。我在论证的精确性方面遇到了一些麻烦。当我以 a 的身份传递时,我只得到小数点后六位的精度,即 3.141593000。当我计算正弦和余弦时,这引入了一个小而显着的误差。ctypesmath.pidouble

据我了解,应该有 15 位小数的精度,并且在 python 中确实给出了 15 位小数。在这种情况下可能有什么问题?还有其他人遇到过这个问题吗?你是怎么解决的?doublemath.pi

Python C++ 精度 ctypes

评论

0赞 schlöpp 10/12/2023
澄清您采取了哪些步骤会有所帮助,因为它不直接包含类型。它包含 和 ,它们分别表示 C 类型和。ctypesdoublec_doublec_longdoubledoublelong double
0赞 supvato 10/12/2023
是的,我应该说清楚。我用来传递参数,当我读进去时,我使用 .c_doubledouble
1赞 CristiFati 10/12/2023
[SO]:如何创建最小、可重现的示例 (reprex (mcve))。请出示您的代码。根据评论,我认为您目前处理事情的方式可能完全错误。

答:

0赞 schlöpp 10/12/2023 #1

AFAIK,传入应该返回.下面是 Python 3.11.1 中的示例:math.pictypes.c_doublec_double(3.141592653589793)

>>> import math
>>> import ctypes
>>> ctypes.c_double(math.pi)
c_double(3.141592653589793)

我唯一的猜测是你没有使用 ,但也许是其他一些精度较低的双精度类型。查看 ctypes 类型转换表以查看所有 ctypes 转换ctypes.c_double

评论

0赞 supvato 10/12/2023
你是对的,应该做这项工作。我发现了问题所在。在进程中间的某个地方,它被存储为字符串,用于解析它,然后它被解析回双精度。这大大降低了精度。感谢您的帮助!c_doubledouble'%e'