Python 双精度到PyFloat的转换不正确
我正在学习SWIG,用于在Python中使用C。我已经编写了这个函数,但我不明白为什么包装的Python 双精度到PyFloat的转换不正确,python,c,swig,Python,C,Swig,我正在学习SWIG,用于在Python中使用C。我已经编写了这个函数,但我不明白为什么包装的myfunc返回错误的浮点/双精度值: mfuncs.c #include <stdlib.h> float myfunc(int n) { float result; result = 100 / n; return result; } 最后我得到的是1107558400.0,而不是33.33333 >>> import mfuncs >>> mfuncs.myf
myfunc
返回错误的浮点/双精度值:
mfuncs.c
#include <stdlib.h>
float myfunc(int n) {
float result;
result = 100 / n;
return result;
}
最后我得到的是1107558400.0,而不是33.33333
>>> import mfuncs
>>> mfuncs.myfunc(3)
1107558400.0
>>>
>>>导入MFUNC
>>>mfuncs.myfunc(3)
1107558400
>>>
错误在哪里?不需要SWIG类型映射-它是默认提供的,您只需要为“深奥”类型编写类型映射,这里提供的默认
double
/float
类型就可以了
这里真正的问题是,编译时没有启用警告或忽略警告养成使用“-Wall-Wextra”或编译器要求的任何工具进行编译的习惯是非常值得的,以启用最大警告并注意它们。
SWIG接口只告诉SWIG函数myfunc
,但该接口中没有任何内容可以让编译器使用声明来编译生成的myfunc\u wrap.c。这意味着,当您编译共享库时,您依赖于myfunc
的隐式声明。我的机器上带有-Wall的GCC报告如下:
test_wrap.c:3139:3:警告:函数“myfunc”的隐式声明
隐式声明假定它返回int
。这就是C语言中的规则,如果没有声明,就好像你写了:
#include <stdlib.h>
int myfunc(int n);
int main() {
printf("%d\n", myfunc(3));
return 0;
}
这是因为%{
和%}
之间的代码直接传递给生成的包装器,这使得编译器在构建包装器时知道myfunc
的真正声明
但在我看来,有一个更好的解决方案:在头文件中只提供一次声明,然后您的接口文件变成:
%module mfuncs
%{
#include "myfunc.h"
%}
%include "myfunc.h"
(显然,
#在myfunc.c中包含“myfunc.h”
)。这样,您只需编写一次声明,如果有不太符合预期的内容,编译器将发出警告/错误,而不是进行(通常是错误的)最佳猜测。此代码中有两个错误,它们阻止myfunc(3)
返回您预期的33.3333。柔印极好地解释了包装问题。另一个问题是这条线
result = 100 / n;
100
是一个int,n
是一个int,除法的结果将是一个int,然后转换为float。所以myfunc(3)
==33。
Python2的作用方式与此相同,在Python3中对其进行了更改,使两个int的除法产生一个浮点
把那行改成
result = 100.0 / n;
或者将
n
设为float/double.这在我看来不像通常的swig-typemap语法。你为什么要使用类型映射进行转换?swig无论如何都是正确的?@Voo-类型映射是合法的语法-它是一个(不要与多参数类型映射混淆),但你是对的,它是不必要的。@Flexo我对他将其定义为字符串的事实感到困惑,这是以前从未见过的。对我来说似乎没有必要(我喜欢我的自动完成),但允许。顺便说一句,很好。@Alexander,你应该通过他帖子左侧的复选标记将Flexo的答案标记为正确答案。
result = 100 / n;
result = 100.0 / n;