“我如何代表”;inf";(浮点无限)使用Python C API?

“我如何代表”;inf";(浮点无限)使用Python C API?,python,python-c-api,Python,Python C Api,我正在用C/C++编写一个处理数值的Python扩展。当用户传入的值太大而无法放入浮点时,我希望返回Python代码中表示为inf的值。如何在C/C++中实现这一点?官方文档中的页面列出了PyFloat_GetMax(),但没有列出inf。我在Python 3.9源代码中搜索了此函数,发现如下内容: SetDblFlag(DBL_MAX); SetIntFlag(DBL_MAX_EXP); SetIntFlag(DBL_MAX_10_EXP); SetDblFlag(DBL_MIN); SetI

我正在用C/C++编写一个处理数值的Python扩展。当用户传入的值太大而无法放入浮点时,我希望返回Python代码中表示为
inf
的值。如何在C/C++中实现这一点?官方文档中的页面列出了
PyFloat_GetMax()
,但没有列出
inf
。我在Python 3.9源代码中搜索了此函数,发现如下内容:

SetDblFlag(DBL_MAX);
SetIntFlag(DBL_MAX_EXP);
SetIntFlag(DBL_MAX_10_EXP);
SetDblFlag(DBL_MIN);
SetIntFlag(DBL_MIN_EXP);
SetIntFlag(DBL_MIN_10_EXP);
SetIntFlag(DBL_DIG);
SetIntFlag(DBL_MANT_DIG);
SetDblFlag(DBL_EPSILON);
SetIntFlag(FLT_RADIX);
SetIntFlag(FLT_ROUNDS);

但这些似乎都不是我想要的。理论上,我可以将1添加到DBL_MAX,但这似乎不是很干净。有什么建议吗?

PyFloat\u FromDouble
返回给定
double
值的
float
对象
math.h
为IEEE 754 infinity(仅供参考,它是一个有效位为0且指数中所有有效位均为1的浮点)提供了一个宏,您可以将其用作参数

#include <math.h>

...

    return PyFloat_FromDouble(INFINITY)
在这两种情况下,您都可以看到(如果您将十六进制转换为二进制)0符号位、1指数位和0表示位。您还可以看到负无穷大:

>>> struct.pack("!f", -float('inf'))
b'\xff\x80\x00\x00'
>>> struct.pack("!d", -float('inf'))
b'\xff\xf0\x00\x00\x00\x00\x00\x00'
与正无穷大相同,但具有前导1符号位



严格地说,Python不采用任何特定的浮点格式;它使用底层平台提供的任何东西。在不使用IEEE 754浮点值的系统上,行为可能不同。特别是,我不知道是否存在
INFINITY
(或
math.h
本身)取决于IEEE 754,或者是否有相关的C标准要求它。

我看到
math.h
提供了
INFINITY
宏;我怀疑这将是double
PyFloat\u的有效参数。IEEE 754将无穷大定义为一个浮点/双精度数,所有的一个都在指数字段中,有效位为0。@chepner,这解决了我的问题,谢谢!如果你把它作为答案发布,我会选择它。
>>> struct.pack("!f", -float('inf'))
b'\xff\x80\x00\x00'
>>> struct.pack("!d", -float('inf'))
b'\xff\xf0\x00\x00\x00\x00\x00\x00'