python調(diào)用dll出現(xiàn)精度問(wèn)題解決
問(wèn)題:python 在調(diào)用dll 的時(shí)候出現(xiàn)了精度問(wèn)題
總結(jié):使用decimal庫(kù)進(jìn)行轉(zhuǎn)換就可以正常傳遞。
遇到的問(wèn)題具體情況
dll 生成函數(shù)代碼聲明如下
extern __declspec(dllexport) void LinearCompute(GoFloat64 currentX, GoFloat64 currentY, GoFloat64 targetX, GoFloat64 targetY, GoFloat64* resultX, GoFloat64* resultY);
使用python調(diào)用代碼
from ctypes import * # c_double 聲明c 雙精度小數(shù)變量 result_x = c_double(0) result_y = c_double(0) x_c = 1400. y_c = 1450. x_t = 1500. y_t = 5600. # byref 調(diào)用指針 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)
但是輸出的內(nèi)容顯示,輸入到函數(shù)中的 x_c ,y_c 等數(shù)據(jù)對(duì)不上。

這里需要使用 decimal 庫(kù)進(jìn)行精度方面轉(zhuǎn)換
所以以上代碼改為如下:
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)
然后運(yùn)行的結(jié)果如下

可以看見(jiàn) 傳入的數(shù)值變得正常了。
附:http://www.dhdzp.com/article/275779.htm
Decimal類型的優(yōu)點(diǎn)
Decimal類型是在浮點(diǎn)類型的基礎(chǔ)上設(shè)計(jì)的,但是它在幾個(gè)地方上要優(yōu)于floating point:
- Decimal類型可以非常精確地在計(jì)算機(jī)中存儲(chǔ),而學(xué)過(guò)c++的都知道,浮點(diǎn)型在計(jì)算機(jī)中是無(wú)法精確存儲(chǔ)的,比如1.1和2.2在計(jì)算機(jī)中存儲(chǔ)后,運(yùn)算(1.1+2.2)表達(dá)式的值結(jié)果會(huì)是3.3000000000000003;Decimal類型則不會(huì)出現(xiàn)這種情況。同樣,由于無(wú)法精確存儲(chǔ),浮點(diǎn)型也就無(wú)法精確計(jì)算(相對(duì)于Decimal類型),可以再測(cè)試(0.1+0.1+0.1-0.3)兩種類型的計(jì)算結(jié)果。
- Decimal類型會(huì)自動(dòng)保留小數(shù)點(diǎn)后面不需要的0,以與輸入的精度相匹配,比如下面小程序中的例子:浮點(diǎn)型的1.20+1.30結(jié)果是2.5;而Decimal類型結(jié)果是2.50,這樣貌似比較人性化。
- Decimal類型可以根據(jù)需要自己設(shè)置小數(shù)點(diǎn)后精度。通過(guò)getcontext().prec = x (x為你想要的精度來(lái)設(shè)置,getcontext()函數(shù)下面再詳細(xì)介紹)。
- Decimal類型有很強(qiáng)的管理功能,它能夠根據(jù)需要設(shè)置,來(lái)控制輸出的格式,得到或者忽略某類錯(cuò)誤(如除0,可以設(shè)置忽略它,而得到一個(gè)Infinity的Decimal值)。
比較重要的一點(diǎn),如果使用 decimal 轉(zhuǎn)換小數(shù)時(shí),需要使用 單引號(hào) 引起來(lái)。
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)) #輸出結(jié)果 ''' 4.399999999999999911182158030 -2.199999999999999733546474090 3.630000000000000097699626167 0.3333333333333333781908292778 '''

但是如果使用字符串,就可以得到正常的結(jié)果了。
到此這篇關(guān)于python調(diào)用dll出現(xiàn)精度問(wèn)題解決的文章就介紹到這了,更多相關(guān)python調(diào)用dll精度問(wèn)題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 關(guān)于python調(diào)用c++動(dòng)態(tài)庫(kù)dll時(shí)的參數(shù)傳遞問(wèn)題
- python調(diào)用DLL與EXE文件截屏對(duì)比分析
- python使用ctypes庫(kù)調(diào)用DLL動(dòng)態(tài)鏈接庫(kù)
- 使用python來(lái)調(diào)用CAN通訊的DLL實(shí)現(xiàn)方法
- 詳解Python 調(diào)用C# dll庫(kù)最簡(jiǎn)方法
- python調(diào)用Delphi寫的Dll代碼示例
- Python調(diào)用C# Com dll組件實(shí)戰(zhàn)教程
- Python 調(diào)用DLL操作抄表機(jī)
相關(guān)文章
django將圖片保存到mysql數(shù)據(jù)庫(kù)并展示在前端頁(yè)面的實(shí)現(xiàn)
這篇文章主要介紹了django將圖片保存到mysql數(shù)據(jù)庫(kù)并展示在前端頁(yè)面的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
python 實(shí)現(xiàn)矩陣按對(duì)角線打印
今天小編就為大家分享一篇python 實(shí)現(xiàn)矩陣按對(duì)角線打印,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
Python使用matplotlib實(shí)現(xiàn)的圖像讀取、切割裁剪功能示例
這篇文章主要介紹了Python使用matplotlib實(shí)現(xiàn)的圖像讀取、切割裁剪功能,結(jié)合實(shí)例形式分析了Python基于matplotlib操作圖片的加載、讀取、坐標(biāo)控制及裁剪相關(guān)操作技巧,需要的朋友可以參考下2018-04-04
python dataprep庫(kù)簡(jiǎn)化加速數(shù)據(jù)科學(xué)操作
這篇文章主要為大家介紹了python dataprep庫(kù)簡(jiǎn)化加速數(shù)據(jù)科學(xué)操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Python實(shí)現(xiàn)刪除時(shí)保留特定文件夾和文件的示例
下面小編就為大家分享一篇Python實(shí)現(xiàn)刪除時(shí)保留特定文件夾和文件的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
Pytorch-mlu?實(shí)現(xiàn)添加逐層算子方法詳解
本文主要分享了在寒武紀(jì)設(shè)備上?pytorch-mlu?中添加逐層算子的方法教程,代碼具有一定學(xué)習(xí)價(jià)值,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11
詳解用Python調(diào)用百度地圖正/逆地理編碼API
這篇文章主要介紹了詳解用Python調(diào)用百度地圖正/逆地理編碼API,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
python3實(shí)現(xiàn)TCP協(xié)議的簡(jiǎn)單服務(wù)器和客戶端案例(分享)
下面小編就為大家?guī)?lái)一篇python3實(shí)現(xiàn)TCP協(xié)議的簡(jiǎn)單服務(wù)器和客戶端案例(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06

