python 调用 dll 出现精度问题

news2025/1/8 21:42:38

问题: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/112950820

Decimal类型的优点

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

  1. Decimal类型可以非常精确地在计算机中存储,而学过c++的都知道,浮点型在计算机中是无法精确存储的,比如1.1和2.2在计算机中存储后,运算(1.1+2.2)表达式的值结果会是3.3000000000000003;Decimal类型则不会出现这种情况。同样,由于无法精确存储,浮点型也就无法精确计算(相对于Decimal类型),可以再测试(0.1+0.1+0.1-0.3)两种类型的计算结果。

  2. Decimal类型会自动保留小数点后面不需要的0,以与输入的精度相匹配,比如下面小程序中的例子:浮点型的1.20+1.30结果是2.5;而Decimal类型结果是2.50,这样貌似比较人性化。

  3. Decimal类型可以根据需要自己设置小数点后精度。通过getcontext().prec = x (x为你想要的精度来设置,getcontext()函数下面再详细介绍)。

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

在这里插入图片描述
但是如果使用字符串,就可以得到正常的结果了。







————————————————————底线————————————————————

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/352463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手机棋牌游戏开发的流程是怎样的?

最近几年,随着网络游戏的兴起,棋牌手游开发也越来越受欢迎,在国内,几乎随处可见从事手游和手游的公司。不过,虽然公司和产品很多,但效果也不一样,区别就在于,他们能不能掌握好这款游…

实现一个更快的终端彩色文本格式化工具库

终端中打印的五颜六色的彩色文本,你知道是怎么实现的吗,你都知道或用过哪些相关的工具库呢?来一起了解一下吧! 在前端项目开发中,说到控制台终端彩色文本格式化,你可能会想到 chalk、picocolors、ansi-colo…

ElasticSearch入门安装与SpringBoot集成实战

介绍 Elasticsearch 是一个实时分布式搜索和分析引擎,一般用于全文搜索、结构化搜索,分析或者三者混用。 它的底层是基于Apache Lucene(TM)的开源搜索引擎,但是lucene只是一个库,需要java开发然后集成到应…

LeetCode刷题复盘笔记—一文搞懂贪心算法之452. 用最少数量的箭引爆气球(贪心算法系列第十一篇)

今日主要总结一下可以使用贪心算法解决的一道题目,452. 用最少数量的箭引爆气球 题目:452. 用最少数量的箭引爆气球 Leetcode题目地址 题目描述: 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#…

备战蓝桥杯【二维前缀和】

🌹作者:云小逸 📝个人主页:云小逸的主页 📝Github:云小逸的Github 🤟motto:要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前…

【自学MYSQL】MySQL Windows安装

MySQL Windows安装 MySQL Windows下载 首先,我们打开 MySQL 的官网,网址如下: https://dev.mysql.com/downloads/mysql/在官网的主页,我们首先根据我们的操作系统,选择对应的系统,这里我们选择 Windows&…

神奇的nextTick一定能获取到最新的dom么?

前言 众所周知,vue的dom更新操作时异步的,为了获取更新后的dom官方提供了相应的apinextTick,文档中对该api的描述为:将回调延迟到下次 DOM 更新循环之后执行 , 所谓的下一次,到底是哪一次呢?dom更新是异步任务&#xf…

【数据结构与算法】链表1:移除链表 设计链表链表反转(双指针法、递归法)

文章目录今日任务1.链表理论基础(1)什么是链表?(2)链表的类型(3)链表的存储方式(4)链表的定义(5)链表的操作(6)性能分析2.…

【设计模式】综述

设计模式概述 文章目录一、设计模式1. 基本简介2. 面向对象设计原则二、基本类别1. 创建型模式会更新每种模式的详细博客超链接,敬请期待呀参考博客😊点此到文末惊喜↩︎ 一、设计模式 1. 基本简介 定义:设计模式是一个针对重复发生的问题的…

使用HTTP隧道代理,请求超过频率要怎么办?

在网上,经常会看到有人说使用隧道代理经常遇到429错误(请求超过频率),我们要如何解决这一问题呢?通常情况,优质的HTTP代理厂商隧道代理服务器采用的是高性能主机构建的动态IP代理服务器,是可以支…

IO流

标题IO流的体系结构FileReader和FileWriterFileReader读入数据的基本操作FileReader中使用read(char [] cbuf)读入数据FileWriter写出数据字节流使用FileInputStream和FileOutputStream读写文本文件使用FileInputStream和FileOutputStream读写非文本文件缓冲流缓冲流&#xff0…

智慧校园平台源码:实现互联互通的校园管理一体化

智慧校园管理平台主要以校园安全、智慧校园数据管理云平台为核心,实现数据统一管理,以智慧电子班牌为学生智慧之窗,以移动管理平台、家校沟通为辅。实现教师—家长一学校—学生循环的无纸化管理模式及教学服务,实现多领域的信息互…

【JavaSE】Lambda、Stream(659~686)

659.每天一考 1.写出获取Class实例的三种常见方式 Class clazz1 String.class; Class clazz2 person.getClass(); //sout(person); //xxx.yyy.zzz.Person... Class clazz3 Class.forName(String classPath);//体现反射的动态性2.谈谈你对Class类的理解 Class实例对应着加载…

小小bat-day1-自动文件上传

前言:日常服务器备份文件或者生产设备等数据文件都统一保存至文件服务器,进行日志分析或者将生产文件CSV、图片等转存至数仓进行数据分析,尤其生产的部分数据是保存在个人电脑的PC端,数据杂,获取困难,手动整…

day45【代码随想录】动态规划之完全平方数、单词拆分、打家劫舍、打家劫舍 II

文章目录前言一、完全平方数(力扣279)二、单词拆分(力扣139)三、打家劫舍(力扣198)四、打家劫舍 II前言 1、完全平方数 2、单词拆分 3、打家劫舍 4、打家劫舍 II 一、完全平方数(力扣279&#…

2023软考报名(上半年)报名什么时候开始?-弘博创新

2023软考报名(上半年)报名预计在3月底-4月初开始,现在可以先进入备考了,参加学习可以到弘博创新,专业考前辅导多年,专业靠谱! 系统集成项目管理工程师是全国计算机技术与软件专业技术资格&#…

Windows安装VMware虚拟机+配置Ubuntu的详细步骤以及解决配置过程中报错的问题(完整版)

目录 引言: 过程: 安装VMware虚拟机: 在VMware虚拟机中配置Ubuntu: 在VMware虚拟机中安装Ubuntu: VMware中启动虚拟机时报错问题的解决: 正式开始安装Ubuntu: 参考资料: 引言: 在学习计…

线程池源码解析项目中如何配置线程池

目录 基础回顾 线程池执行任务流程 简单使用 构造函数 execute方法 execute中出现的ctl属性 execute中出现的addWorker方法 addWorker中出现的addWorkerFailed方法 addWorker中出现的Worker类 Worker类中run方法出现的runWorker方法 runWorker中出现的getTask runWo…

Websocket详细介绍

需求背景 在某个资产平台,在不了解需求的情况下,我突然接到了一个任务,让我做某个页面窗口的即时通讯,想到了用websocket技术,我从来没用过,被迫接受了这个任务,我带着浓烈的兴趣,就…

MinIO

概述MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从…