当restype = c_double时,如何使用ctypes从C ++获取正确的double类型?

时间:2019-04-02 10:59:41

标签: python c++ c ctypes

我正在创建一个三角计算器,以测试IoT产品的输出。测试软件是使用python构建的,而产品的固件是使用C ++构建的。我想测试一些数学函数,例如SIN。但是,numpy.sin()输出和C ++ math.sin输出在大数/复数浮点数上会有所不同。例如,我必须计算以下数字:numpy.float64(1.7976931348623157e+308)。我决定使用C ++ cmath库获取sin(np.float64(1.7976931348623157e+308)的结果,并使用ctypes在C ++代码和python之间进行接口。

但是,ctypes的返回类型与预期的不同。我希望它是两倍(等同于numpy.float64)。我已经设置了restype = c_double

我现在所拥有的: 一种。 VS2017中的DLL项目 b。调用的python代码

这是从C ++ DLL项目计算的代码以及要调用的相应python代码:

CalculatorTrigonometry.h

#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;
}

以上代码使用发行版和x86构建配置编译为dll。

我使用numpy调用此dll,如下所示: try_dll.py

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

正如您在上面看到的,我的意图是在我们的测试软件中获取双精度类型的输出以进行进一步处理,但我一直保持浮动状态。有人知道发生了什么吗?我可能会错过一些东西。

0 个答案:

没有答案