浮点数对象

type PyFloatObject

这是 PyObject 的子类型,表示 Python 浮点数对象。

PyTypeObject PyFloat_Type
稳定 ABI 的一部分。

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

int PyFloat_Check(PyObject *p)

如果参数是 PyFloatObjectPyFloatObject 的子类型,则返回真。此函数总是成功。

int PyFloat_CheckExact(PyObject *p)

如果参数是 PyFloatObject,而不是 PyFloatObject 的子类型,则返回真。此函数总是成功。

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 的一部分。

返回一个结构序列实例,其中包含有关浮点数的精度、最小值和最大值的信息。 它是头文件 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 754 支持的更高精度或更大动态范围的非 IEEE 平台上,并非所有值都可以打包;在具有更低精度或更小动态范围的非 IEEE 平台上,并非所有值都可以解包。 在这种情况下发生的事情部分是偶然的(唉)。

3.11 版本新增。

打包函数

打包例程从 p 开始写入 2、4 或 8 个字节。 如果您想要小端格式的字节字符串(指数在最后,位于 p+1p+3p+6 p+7),则 le 是一个非零的 int 参数;如果您想要大端格式(指数在最前面,位于 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 个字节。如果字节字符串采用小端格式(指数位于最后,分别位于 p+1p+3p+6p+7),则 *le* 是一个非零的 int 参数;如果采用大端格式(指数位于最前,位于 *p*),则 *le* 为零。可以使用 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 binary16 半精度格式解包为 C double。

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

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

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

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