浮點物件

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。