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=%ld\n", 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]=%lf\n", i, my_array[i]);

}

double result;

result=0.;

for(i=0; i

result+=my_array[i];

}

printf("result=%lf\n", 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。当然,它非常接近正确的结果,但不一样。我错过了什么?在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值