如何使用Python C API表示“inf”(浮点无穷大)?

2024-09-30 14:19:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用C/C++编写一个处理数值的Python扩展。当用户传入的值太大而无法放入浮点时,我希望返回Python代码中表示为inf的值。如何在C/C++中实现这一点?官方文件中的Floating Point Objects页列出了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,但这似乎不是很干净。有什么建议吗


Tags: 文件代码用户官方minmax数值inf
1条回答
网友
1楼 · 发布于 2024-09-30 14:19:46

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

#include <math.h>

...

    return PyFloat_FromDouble(INFINITY)

另一方面,您可以在Python本身中看到无穷大的这个值:

>>> import struct
>>> >>> struct.pack("!f", float('inf'))
b'\x7f\x80\x00\x00'
>>> struct.pack("!d", float('inf'))
b'\x7f\xf0\x00\x00\x00\x00\x00\x00'

在这两种情况下,您都可以看到(如果您将十六进制转换为二进制)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标准要求它

相关问题 更多 >