Python 如何从C++;当restype=c\u double时使用ctypes?
我正在创建一个三角计算器来测试物联网产品的输出。测试软件是用Python构建的,而产品的固件是用C++构建的。我想测试一些数学函数,比如SIN。但是,在大数/复数浮点数上,<代码> NoPy.Sn[())/CUD>输出和C++ Myth.Sin输出将有所不同。例如,我必须计算这个数字:Python 如何从C++;当restype=c\u double时使用ctypes?,python,c++,c,ctypes,Python,C++,C,Ctypes,我正在创建一个三角计算器来测试物联网产品的输出。测试软件是用Python构建的,而产品的固件是用C++构建的。我想测试一些数学函数,比如SIN。但是,在大数/复数浮点数上, NoPy.Sn[())/CUD>输出和C++ Myth.Sin输出将有所不同。例如,我必须计算这个数字:numpy.float64(1.7976931348623157e+308)。我决定使用C++ CyMaple库来获得Sin(NP.FulAT64(1.797 693136623 157E+ 308)< /> >)的结果,
numpy.float64(1.7976931348623157e+308)
。我决定使用C++ CyMaple库来获得Sin(numpy.float64
)。我已经设置了restype=c\u double
我现在所拥有的:
A.VS2017中的DLL项目
B要调用的python代码
这是从C++ DLL项目和各自的Python代码中调用的代码: 计算精密度
#pragma once
#ifdef CALCULATORTRIGONOMETRY_EXPORTS
#define CALCULATORTRIGONOMETRY_API __declspec(dllexport)
#else
#define CALCULATORTRIGONOMETRY_API __declspec(dllimport)
#endif
extern "C"
{
CALCULATORTRIGONOMETRY_API float calc_sin_float(const float val);
CALCULATORTRIGONOMETRY_API double calc_sin_double(const double val);
}
CalculatorTrigonometry.cpp
// CalculatorTrigonometry.cpp : Defines the exported functions for the DLL application.
//
#include "stdafx.h"
#include "CalculatorTrigonometry.h"
#include <cmath>
float calc_sin_float(const float val)
{
float res = sin(val);
return res;
}
double calc_sin_double(const double val)
{
double res = sin(val);
return res;
}
正如您在上面看到的,我的意图是获得双类型输出,以便在我们的测试软件中进行进一步处理,但我一直使用float。有人知道发生了什么吗?我可能会错过一些东西。C
double
被认为是python浮点类型,如(查看python类型)。如果您担心上一次打印总是打印float
,那么这是完全正常的,也是意料之中的。numpy.sin
和Python的math.sin
都会给出相同的答案。Pythonfloat
、numpyfloat64
和C/C++double
都是等效的IEEE 754双精度浮点数。真正的问题是什么?您不需要ctypes
。我需要提供解决方案,因为python(基于windows)输出的sin和使用VS Studio输出编译的math.sin对于复杂浮点数而言,与使用mingw或基于unix/posix的编译器编译的sin以及测试中的设备不同。由于我的雇主政策,我无法切换到linux。我能做的就是安装mingw编译器并创建一个单独的库,这样我的python就可以利用这个库了。@Oscar那么你的问题应该是一个复数示例,而不是双精度的。正如Neitsa所说,C double和Python float是同一件事,所以您的问题没有意义。
from ctypes import *
import numpy as np
import numpy.ctypeslib as npct
hllDll = npct.load_library ("CalculatorTrigonometry", '.')
hllDll.calc_sin_double.argtype = [c_double]
hllDll.calc_sin_double.restype = c_double
b = np.float64(1.7976931348623157e+308)
ctypes_b = npct.as_ctypes(b)
print type(ctypes_b)
print type(hllDll.calc_sin_double(ctypes_b))