Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从C++;当restype=c\u double时使用ctypes?_Python_C++_C_Ctypes - Fatal编程技术网

Python 如何从C++;当restype=c\u double时使用ctypes?

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)< /> >)的结果,

我正在创建一个三角计算器来测试物联网产品的输出。测试软件是用Python构建的,而产品的固件是用C++构建的。我想测试一些数学函数,比如SIN。但是,在大数/复数浮点数上,<代码> NoPy.Sn[())/CUD>输出和C++ Myth.Sin输出将有所不同。例如,我必须计算这个数字:
numpy.float64(1.7976931348623157e+308)
。我决定使用C++ CyMaple库来获得Sin(NP.FulAT64(1.797 693136623 157E+ 308)< /> >)的结果,并使用cType实现C++代码与Python之间的接口。 但是,ctypes的返回类型与预期不同。我希望它是双精度的(相当于
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
都会给出相同的答案。Python
float
、numpy
float64
和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))