网站建设亿码酷出名5,城阳网站建设公司,承德网站建设方案,wordpress怎么创建自己的博客问题#xff1a;python 在调用dll 的时候出现了精度问题
总结#xff1a;使用decimal库进行转换就可以正常传递。
‘ 心急的朋友可以略过下文了。 心急的朋友可以略过下文了。 心急的朋友可以略过下文了。 心急的朋友可以略过下文了。 ’
遇到的问题具体情况
dll 生成函数…问题python 在调用dll 的时候出现了精度问题
总结使用decimal库进行转换就可以正常传递。
‘ 心急的朋友可以略过下文了。 心急的朋友可以略过下文了。 心急的朋友可以略过下文了。 心急的朋友可以略过下文了。 ’
遇到的问题具体情况
dll 生成函数代码声明如下
extern __declspec(dllexport) void LinearCompute(GoFloat64 currentX, GoFloat64 currentY, GoFloat64 targetX, GoFloat64 targetY, GoFloat64* resultX, GoFloat64* resultY);使用python调用代码
from ctypes import *# c_double 声明c 双精度小数变量
result_x c_double(0)
result_y c_double(0)x_c 1400.
y_c 1450.
x_t 1500.
y_t 5600.# byref 调用指针
dll.LinearCompute(c_double(x_c), c_double(y_c), c_double(x_t), c_double(y_t), byref(result_x), byref(result_y))print(result_x.value, , result_y.value)但是输出的内容显示输入到函数中的 x_c ,y_c 等数据对不上。 这里需要使用 decimal 库进行精度方面转换
所以以上代码改为如下
from ctypes import *
from decimal import *result_x c_double(0)
result_y c_double(0)x_c Decimal(1400)
y_c Decimal(1450)x_t Decimal(1500)
y_t Decimal(5600)dll.LinearCompute(c_double(x_c), c_double(y_c), c_double(x_t), c_double(y_t), byref(result_x), byref(result_y))print(result_x.value, , result_y.value)然后运行的结果如下 可以看见 传入的数值变得正常了。
附
这里搜了下 decimal 的说明我把觉得比较常用的一些内容粘过来了。原文链接https://blog.csdn.net/weixin_32487565/article/details/112950820Decimal类型的优点
Decimal类型是在浮点类型的基础上设计的但是它在几个地方上要优于floating point Decimal类型可以非常精确地在计算机中存储而学过c的都知道浮点型在计算机中是无法精确存储的比如1.1和2.2在计算机中存储后运算(1.12.2)表达式的值结果会是3.3000000000000003Decimal类型则不会出现这种情况。同样由于无法精确存储浮点型也就无法精确计算(相对于Decimal类型)可以再测试(0.10.10.1-0.3)两种类型的计算结果。 Decimal类型会自动保留小数点后面不需要的0以与输入的精度相匹配比如下面小程序中的例子浮点型的1.201.30结果是2.5而Decimal类型结果是2.50这样貌似比较人性化。 Decimal类型可以根据需要自己设置小数点后精度。通过getcontext().prec x (x为你想要的精度来设置getcontext()函数下面再详细介绍)。 Decimal类型有很强的管理功能它能够根据需要设置来控制输出的格式得到或者忽略某类错误(如除0可以设置忽略它而得到一个Infinity的Decimal值)。
比较重要的一点如果使用 decimal 转换小数时需要使用 单引号 引起来。
from decimal import *print(Decimal(1.1) Decimal(3.3))
print(Decimal(1.1) - Decimal(3.3))
print(Decimal(1.1) * Decimal(3.3))
print(Decimal(1.1) / Decimal(3.3))#输出结果4.399999999999999911182158030
-2.199999999999999733546474090
3.630000000000000097699626167
0.3333333333333333781908292778但是如果使用字符串就可以得到正常的结果了。
‘ ’ ‘ ’ ‘ ’ ————————————————————底线————————————————————