浮点数对象

type PyFloatObject

PyObject 子类型表示 Python 浮点数对象。

PyTypeObject PyFloat_Type
稳定 ABI 的一部分。

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

int PyFloat_Check(PyObject *p)

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

int PyFloat_CheckExact(PyObject *p)

如果其参数是 PyFloatObject,但不是 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

打包和解包函数

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

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

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

在 3.11 版中添加。

打包函数

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

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

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

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

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

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

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

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

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

int PyFloat_Pack8(double x, unsigned 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.0,并且 PyErr_Occurred() 为 true(并且会设置一个异常,很可能是 OverflowError)。

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

double PyFloat_Unpack2(const unsigned char *p, int le)

将 IEEE 754 二进制 16 半精度格式解包为 C double。

double PyFloat_Unpack4(const unsigned char *p, int le)

将 IEEE 754 二进制 32 单精度格式解包为 C double。

double PyFloat_Unpack8(const unsigned char *p, int le)

将 IEEE 754 二进制 64 双精度格式解包为 C double。