python调用dll出现精度问题解决

 更新时间:2023年02月19日 15:07:05   作者:嘿,不许笑  
本文主要介绍了python调用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)

然后运行的结果如下

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

附: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 转换小数时,需要使用 单引号 引起来。

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
'''

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

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

相关文章

  • django将图片保存到mysql数据库并展示在前端页面的实现

    django将图片保存到mysql数据库并展示在前端页面的实现

    这篇文章主要介绍了django将图片保存到mysql数据库并展示在前端页面的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • python 实现矩阵按对角线打印

    python 实现矩阵按对角线打印

    今天小编就为大家分享一篇python 实现矩阵按对角线打印,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Python使用matplotlib实现的图像读取、切割裁剪功能示例

    Python使用matplotlib实现的图像读取、切割裁剪功能示例

    这篇文章主要介绍了Python使用matplotlib实现的图像读取、切割裁剪功能,结合实例形式分析了Python基于matplotlib操作图片的加载、读取、坐标控制及裁剪相关操作技巧,需要的朋友可以参考下
    2018-04-04
  • python  dataprep库简化加速数据科学操作

    python  dataprep库简化加速数据科学操作

    这篇文章主要为大家介绍了python  dataprep库简化加速数据科学操作,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Python中私有属性的定义方式

    Python中私有属性的定义方式

    这篇文章主要介绍了Python中私有属性的定义方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Python实现删除时保留特定文件夹和文件的示例

    Python实现删除时保留特定文件夹和文件的示例

    下面小编就为大家分享一篇Python实现删除时保留特定文件夹和文件的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • Pytorch-mlu 实现添加逐层算子方法详解

    Pytorch-mlu 实现添加逐层算子方法详解

    本文主要分享了在寒武纪设备上 pytorch-mlu 中添加逐层算子的方法教程,代码具有一定学习价值,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-11-11
  • Python Django模板系统详解

    Python Django模板系统详解

    这篇文章主要介绍Django模板系统Django模板系统的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-11-11
  • 详解用Python调用百度地图正/逆地理编码API

    详解用Python调用百度地图正/逆地理编码API

    这篇文章主要介绍了详解用Python调用百度地图正/逆地理编码API,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • python3实现TCP协议的简单服务器和客户端案例(分享)

    python3实现TCP协议的简单服务器和客户端案例(分享)

    下面小编就为大家带来一篇python3实现TCP协议的简单服务器和客户端案例(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06

最新评论