我如何使用 Python C API 表示 "inf"(浮点无穷大)?
How do I represent "inf" (floating-point infinity) using the Python C API?
我正在 C/C++ 中编写一个 Python 扩展,它可以处理数值。当用户传入一个太大而无法放入浮点数的值时,我想 return 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);
但其中 none 似乎正是我要找的。理论上,我可以在 DBL_MAX 上加 1,但这似乎不太干净。有什么建议吗?
PyFloat_FromDouble
returns 给定 double
值的 float
对象。 math.h
为 IEEE 754 无穷大提供了一个宏(仅供参考,它是一个具有 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 标准强制执行它。
我正在 C/C++ 中编写一个 Python 扩展,它可以处理数值。当用户传入一个太大而无法放入浮点数的值时,我想 return 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);
但其中 none 似乎正是我要找的。理论上,我可以在 DBL_MAX 上加 1,但这似乎不太干净。有什么建议吗?
PyFloat_FromDouble
returns 给定 double
值的 float
对象。 math.h
为 IEEE 754 无穷大提供了一个宏(仅供参考,它是一个具有 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 标准强制执行它。