浮点数对象¶
-
PyTypeObject PyFloat_Type¶
- 稳定 ABI 的一部分。
此
PyTypeObject
实例表示 Python 浮点数类型。此对象与 Python 层中的float
相同。
-
int PyFloat_Check(PyObject *p)¶
如果其参数是
PyFloatObject
或PyFloatObject
的子类型,则返回 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__()
。
-
PyObject *PyFloat_GetInfo(void)¶
- 返回值:新引用。稳定 ABI 的一部分。
返回一个包含有关浮点数的精度、最小值和最大值的信息的 structseq 实例。它是头文件
float.h
的一个精简包装。
打包和解包函数¶
打包和解包函数提供了一种高效的平台无关的方式,可以将浮点值存储为字节字符串。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+1
、p+3
或 p+6
和 p+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+1
、p+3
或 p+6
和 p+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。