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。