经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
python调用dll出现精度问题解决
来源:jb51  时间:2023/2/20 15:16:38  对本文有异议

问题:python 在调用dll 的时候出现了精度问题

总结:使用decimal库进行转换就可以正常传递。

遇到的问题具体情况

dll 生成函数代码声明如下

  1. extern __declspec(dllexport) void LinearCompute(GoFloat64 currentX, GoFloat64 currentY, GoFloat64 targetX, GoFloat64 targetY, GoFloat64* resultX, GoFloat64* resultY);

使用python调用代码

  1. from ctypes import *
  2.  
  3. # c_double 声明c 双精度小数变量
  4. result_x = c_double(0)
  5. result_y = c_double(0)
  6.  
  7. x_c = 1400.
  8. y_c = 1450.
  9. x_t = 1500.
  10. y_t = 5600.
  11.  
  12. # byref 调用指针
  13. dll.LinearCompute(c_double(x_c), c_double(y_c), c_double(x_t), c_double(y_t), byref(result_x), byref(result_y))
  14.  
  15. print(result_x.value, ' ', result_y.value)

但是输出的内容显示,输入到函数中的 x_c ,y_c 等数据对不上。

这里需要使用 decimal 库进行精度方面转换

所以以上代码改为如下:

  1. from ctypes import *
  2. from decimal import *
  3.  
  4. result_x = c_double(0)
  5. result_y = c_double(0)
  6.  
  7. x_c = Decimal(1400)
  8. y_c = Decimal(1450)
  9.  
  10. x_t = Decimal(1500)
  11. y_t = Decimal(5600)
  12.  
  13. dll.LinearCompute(c_double(x_c), c_double(y_c), c_double(x_t), c_double(y_t), byref(result_x), byref(result_y))
  14.  
  15. print(result_x.value, ' ', result_y.value)

然后运行的结果如下

可以看见 传入的数值变得正常了。

附:https://www.jb51.net/article/275779.htm

Decimal类型的优点

Decimal类型是在浮点类型的基础上设计的,但是它在几个地方上要优于floating point:

  • Decimal类型可以非常精确地在计算机中存储,而学过c++的都知道,浮点型在计算机中是无法精确存储的,比如1.1和2.2在计算机中存储后,运算(1.1+2.2)表达式的值结果会是3.3000000000000003;Decimal类型则不会出现这种情况。同样,由于无法精确存储,浮点型也就无法精确计算(相对于Decimal类型),可以再测试(0.1+0.1+0.1-0.3)两种类型的计算结果。
  • Decimal类型会自动保留小数点后面不需要的0,以与输入的精度相匹配,比如下面小程序中的例子:浮点型的1.20+1.30结果是2.5;而Decimal类型结果是2.50,这样貌似比较人性化。
  • Decimal类型可以根据需要自己设置小数点后精度。通过getcontext().prec = x (x为你想要的精度来设置,getcontext()函数下面再详细介绍)。
  • Decimal类型有很强的管理功能,它能够根据需要设置,来控制输出的格式,得到或者忽略某类错误(如除0,可以设置忽略它,而得到一个Infinity的Decimal值)。

比较重要的一点,如果使用 decimal 转换小数时,需要使用 单引号 引起来。

  1. from decimal import *
  2.  
  3. print(Decimal(1.1) + Decimal(3.3))
  4. print(Decimal(1.1) - Decimal(3.3))
  5. print(Decimal(1.1) * Decimal(3.3))
  6. print(Decimal(1.1) / Decimal(3.3))
  7.  
  8. #输出结果
  9. '''
  10. 4.399999999999999911182158030
  11. -2.199999999999999733546474090
  12. 3.630000000000000097699626167
  13. 0.3333333333333333781908292778
  14. '''

但是如果使用字符串,就可以得到正常的结果了。

到此这篇关于python调用dll出现精度问题解决的文章就介绍到这了,更多相关python调用dll精度问题内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号