将PyFloatObject转换为float

时间:2015-01-14 20:01:34

标签: python c python-c-api python-c-extension

我有PyFloatObject我要转换为C float。但是,PyObjectFloat仅提供双倍转换。我可以安全地将双精度投射到浮点数,或者是否有将PyObject转换为float的函数,即PyObject_AsFloat

3 个答案:

答案 0 :(得分:2)

来自docs

  

浮点数通常使用C中的double实现;

换句话说,Python float类型只是一个C double,因此没有神奇的Python函数可以将Python float转换为C float其他比C通常可用于将double转换为float

答案 1 :(得分:0)

简短的回答是肯定的,只要你的双倍'将(相对于幅度)适合于“浮动”。但是,您可能需要将其四舍五入或将其截断为单精度。

使用IEEE 754浮点表示....

" float定义为IEEE 754单精度,double定义为双精度,long double定义为IEEE 754扩展精度或某种形式的四倍精度(如英特尔80位双扩展精度)在x86或x86-64平台上),否则双精度。以前,所有C90浮动操作都被定义为以双精度进行,随后舍入为单精度,以便在必要时存储结果。"

关于' 754引用的数据来自http://en.wikipedia.org/wiki/C99(维基百科上的c99 c规范说明),而它不是特定的python,IEEE 754是通用的,而不是c特定的)

你使用的是什么版本的python?您可能想要使用(来自https://docs.python.org/2/c-api/float.html

double PyFloat_AsDouble(PyObject * pyfloat) 返回pyfloat内容的C双重表示。如果pyfloat不是Python浮点对象但具有 float ()方法,则首先调用此方法将pyfloat转换为float。失败时此方法返回-1.0,因此应调用PyErr_Occurred()来检查错误。

答案 2 :(得分:0)

sprintf进入一个缓冲区,然后是atoi似乎可以做到这一点