浮點數物件

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。