浮点对象¶
-
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__()
(如果可用)。
-
PyObject *PyFloat_GetInfo(void)¶
- 返回值: 新引用。 稳定ABI 的一部分。
返回一个 structseq 实例,其中包含有关浮点数的精度、最小值和最大值的信息。它是头文件
float.h
的一个薄包装器。
打包和解包函数¶
打包和解包函数提供了一种高效的平台独立方式,将浮点值存储为字节字符串。打包例程从 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+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, 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+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 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。