跳转到内容

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。

参考资料

[编辑 | 编辑源代码]
[编辑 | 编辑源代码]
华夏公益教科书