浮点对象

type PyFloatObject

PyObject 的子类型表示一个 Python 浮点对象。

PyTypeObject PyFloat_Type
作为 稳定 ABI 的一部分。

PyTypeObject 实例表示 Python 浮点类型。这与 Python 层中的 float 对象相同。

int PyFloat_Check(PyObject *p)

如果其参数是 PyFloatObject 或其子类型,则返回 true。此函数始终成功。

int PyFloat_CheckExact(PyObject *p)

如果其参数是 PyFloatObject 但不是其子类型,则返回 true。此函数始终成功。

PyObject *PyFloat_FromString(PyObject *str)
返回值: 新引用。 稳定ABI 的一部分。

根据 str 中的字符串值创建一个 PyFloatObject 对象,失败时返回 NULL

PyObject *PyFloat_FromDouble(double v)
返回值: 新引用。 稳定ABI 的一部分。

v 创建一个 PyFloatObject 对象,失败时返回 NULL

double PyFloat_AsDouble(PyObject *pyfloat)
作为 稳定 ABI 的一部分。

返回 pyfloat 内容的 C double 表示。如果 pyfloat 不是 Python 浮点对象但具有 __float__() 方法,此方法将首先被调用以将 pyfloat 转换为浮点数。如果未定义 __float__(),则回退到 __index__()。此方法失败时返回 -1.0,因此应该调用 PyErr_Occurred() 来检查错误。

3.8 版本发生变更: 使用 __index__()(如果可用)。

double PyFloat_AS_DOUBLE(PyObject *pyfloat)

返回 pyfloat 内容的 C double 表示,但不进行错误检查。

PyObject *PyFloat_GetInfo(void)
返回值: 新引用。 稳定ABI 的一部分。

返回一个 structseq 实例,其中包含有关浮点数的精度、最小值和最大值的信息。它是头文件 float.h 的一个薄包装器。

double PyFloat_GetMax()
作为 稳定 ABI 的一部分。

返回最大可表示有限浮点数 DBL_MAX 作为 C double

double PyFloat_GetMin()
作为 稳定 ABI 的一部分。

返回最小规范正浮点数 DBL_MIN 作为 C double

打包和解包函数

打包和解包函数提供了一种高效的平台独立方式,将浮点值存储为字节字符串。打包例程从 C double 生成一个字节字符串,解包例程从这样的字节字符串生成一个 C double。后缀(2、4 或 8)指定字节字符串中的字节数。

在看起来使用 IEEE 754 格式的平台上,这些函数通过复制位来工作。在其他平台上,2 字节格式与 IEEE 754 binary16 半精度格式相同,4 字节格式(32 位)与 IEEE 754 binary32 单精度格式相同,8 字节格式与 IEEE 754 binary64 双精度格式相同,尽管 INF 和 NaN(如果此类事物存在于平台上)的打包未正确处理,并且尝试解包包含 IEEE INF 或 NaN 的字节字符串将引发异常。

请注意,在 IEEE 平台上(例如在 32 位模式下的 x86 系统上),NaN 类型可能不会被保留(静默 NaN 变为安静)。

在精度或动态范围大于 IEEE 754 支持的非 IEEE 平台上,并非所有值都可以打包;在精度或动态范围小于 IEEE 754 支持的非 IEEE 平台上,并非所有值都可以解包。在这种情况下发生的事情部分是偶然的(可惜)。

在 3.11 版本中新增。

打包函数

打包例程从 p 开始写入 2、4 或 8 个字节。le 是一个 int 参数,如果您希望字节字符串采用小端格式(指数最后,在 p+1p+3p+6 p+7),则为非零;如果您希望采用大端格式(指数在前,在 p),则为零。PY_BIG_ENDIAN 常量可用于使用本机字节序:在大端处理器上它等于 1,在小端处理器上等于 0

返回值:如果一切正常,则为 0;如果出错,则为 -1(并设置异常,最可能是 OverflowError)。

在非 IEEE 平台上存在两个问题

  • 如果 x 是 NaN 或无穷大,则此操作未定义。

  • -0.0+0.0 产生相同的字节字符串。

int PyFloat_Pack2(double x, char *p, int le)

将 C double 打包为 IEEE 754 binary16 半精度格式。

int PyFloat_Pack4(double x, char *p, int le)

将 C double 打包为 IEEE 754 binary32 单精度格式。

int PyFloat_Pack8(double x, char *p, int le)

将 C double 打包为 IEEE 754 binary64 双精度格式。

解包函数

解包例程从 p 开始读取 2、4 或 8 个字节。le 是一个 int 参数,如果字节字符串采用小端格式(指数最后,在 p+1p+3p+6p+7),则为非零;如果采用大端格式(指数在前,在 p),则为零。PY_BIG_ENDIAN 常量可用于使用本机字节序:在大端处理器上它等于 1,在小端处理器上等于 0

返回值:解包后的 double。出错时,它为 -1.0PyErr_Occurred() 为 true(并设置异常,最可能是 OverflowError)。

请注意,在非 IEEE 平台上,这将拒绝解包表示 NaN 或无穷大的字节字符串。

double PyFloat_Unpack2(const char *p, int le)

将 IEEE 754 binary16 半精度格式解包为 C double。

double PyFloat_Unpack4(const char *p, int le)

将 IEEE 754 binary32 单精度格式解包为 C double。

double PyFloat_Unpack8(const char *p, int le)

将 IEEE 754 binary64 双精度格式解包为 C double。