跳轉到內容

C 程式設計/math.h/ldexp

來自華夏公益教科書,開放的書籍,開放的世界

在計算中,ldexp 是一個函式,它將一個雙精度浮點數乘以一個指定的 2 的整數次冪,如果結果是執行環境中用於雙精度浮點數表示的有效浮點數,則返回結果。

它是 C 程式語言的數學庫例程之一,在標頭檔案 math.h 中宣告。

ldexp 函式在 C 程式語言標準 ISO/IEC 9899 [1] 中定義如下

7.12.6.6 ldexp 函式
概要

#include <math.h>

double ldexp(double x, int exp);
double ldexpf(float x, int exp);

long double ldexpl(long double x, int exp);

描述
ldexp 函式將浮點數乘以 2 的整數次冪。可能會發生範圍錯誤。

返回值
ldexp 函式返回 x*2exp

Open Group Single Unix Specification 在 Unixtm 主機環境中擴充套件了 ldexp 的介面定義。[2]

“描述”部分包含以下附加資訊
希望檢查錯誤情況的應用程式應將 errno 設定為零,並在呼叫這些函式之前呼叫 feclearexcept(FE_ALL_EXCEPT)。在返回時,如果 errno 不為零,或者 fetestexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW) 不為零,則發生了錯誤。
“返回值”部分擴充套件了以下條款
如果這些函式會導致溢位,則必須發生範圍錯誤,並且 ldexp()ldexpf()ldexpl() 必須分別返回 ±HUGE_VAL、±HUGE_VALF 和 ±HUGE_VALL(根據 x 的符號)。
如果正確的值會導致下溢,並且無法表示,則可能會發生範圍錯誤,並且必須返回 0.0(如果支援),或者返回實現定義的值。
如果 x 為 NaN,則必須返回 NaN。
如果 x 為 ±0 或 ±Inf,則必須返回 x
如果 exp 為 0,則必須返回 x。
如果正確的值會導致下溢,並且可以表示,則可能會發生範圍錯誤,並且必須返回正確的值。
它還添加了一個“錯誤部分”,如下所示
如果以下情況發生,這些函式必須失敗
範圍錯誤
結果溢位。
如果整數表示式 (math_errhandling & MATH_ERRNO) 不為零,則 errno 必須設定為 [ERANGE]。如果整數表示式 (math_errhandling & MATH_ERREXCEPT) 不為零,則必須引發溢位浮點異常。

對於基於二進位制指數的浮點表示(如 IEEE 754),ldexp 可以透過簡單地從 x 的值中提取指數並將 exp 新增到它來實現,如果結果在表示的有效指數值內,則用結果替換 x 的指數。如果計算出的指數值過高,則函式返回 +∞ 或 -∞(取決於 x 的符號),如果值過低,則函式返回 0.0。

參考資料

[編輯 | 編輯原始碼]
[編輯 | 編輯原始碼]
華夏公益教科書