我是靠谱客的博主 冷艳背包,最近开发中收集的这篇文章主要介绍python double函数_在从Python调用的C函数中使用PyFloat_FromDouble时获得错误结果,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

我正在学习如何通过制作包装器从Python调用C函数。我的最终目标是将Python中声明的大型复杂数组传递给C函数,并取回其他巨大的复杂数组。在

为了理解从Python调用C函数的基本原理,我从一个简单的示例开始。我定义了一个函数,它读取一个双精度数组(任意大小),并返回所有值的和。这是我的wrapperTest.c代码:#include

static PyObject *sumArray(PyObject * self, PyObject * args){

PyObject *ret;

PyObject* myTuple;

if(!PyArg_ParseTuple(args, "O", &myTuple)) return NULL;

printf("PyTuple_Size=%ldn", PyTuple_Size(myTuple));

double *my_array;

my_array=(double*)malloc(sizeof(double)*PyTuple_Size(myTuple));

int tupleSize;

tupleSize=PyTuple_Size(myTuple);

int i;

PyObject* tupleItem;

for(i=0; i

tupleItem=PyTuple_GetItem(myTuple, i);

if(!PyFloat_Check(tupleItem)){

printf("Error: tuple contains a non-float value");

exit(1);

}

my_array[i]=PyFloat_AsDouble(tupleItem);

printf("my_array[%d]=%lfn", i, my_array[i]);

}

double result;

result=0.;

for(i=0; i

result+=my_array[i];

}

printf("result=%lfn", result);

ret=PyFloat_FromDouble(result);

free(my_array);

return ret;

}

static PyMethodDef wrapperTest_funcs[] = {

{"sumArray", (PyCFunction)sumArray,

METH_VARARGS, ""},

{NULL}

};

void initwrapperTest(void)

{

Py_InitModule3("wrapperTest", wrapperTest_funcs,

"Extension module example!");

}

我可以通过运行脚本成功地编译扩展设置.py在

^{pr2}$

使用命令“python设置.py安装”。此外,我可以在运行Python时导入扩展并执行函数。但是,我不能总是从我定义的函数中得到正确的结果。例如,如果我尝试传递数组a=(1.2,2.4),则得到的结果是:>>> import wrapperTest

>>> a=(1.2, 2.4)

>>> b=wrapperTest.sumArray(a)

PyTuple_Size=2

my_array[0]=1.200000

my_array[1]=2.400000

result=3.600000

>>> b

3.5999999999999996

显然,正确的结果是3.6(用C编写的函数打印的结果),但是在Python中得到的最终结果是3.599999999999996。当然,它非常接近正确的结果,但不一样。我错过了什么?在

最后

以上就是冷艳背包为你收集整理的python double函数_在从Python调用的C函数中使用PyFloat_FromDouble时获得错误结果的全部内容,希望文章能够帮你解决python double函数_在从Python调用的C函数中使用PyFloat_FromDouble时获得错误结果所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部