C++ 参考手册

位置:首页 > C++ 参考手册 >数值库 >常用数学函数 > std::ldexp, std::ldexpf, std::ldexpl

定义于头文件 <cmath>
(1)
float       ldexp ( float x, int exp );
float       ldexpf( float x, int exp );
(C++11 起)
double      ldexp ( double x, int exp );
(2)
(3)
long double ldexp ( long double x, int exp );
long double ldexpl( long double x, int exp );
(C++11 起)
double      ldexp ( IntegralType x, int exp );
(4) (C++11 起)
1-3) 将浮点值 arg 乘以 2 的 exp 次幂。
4) 接受任何整数类型参数的重载集或函数模板。等价于 (2) (将参数转型为 double )。

参数

arg - 浮点值
exp - 整数值

返回值

若不出现错误,则返回 arg 乘 2 的 exp 次幂( arg×2exp
)。

若出现上溢所致的值域错误,则返回 ±HUGE_VAL±HUGE_VALF±HUGE_VALL

若出现下溢所致的值域错误,则返回(舍入后的)正确结果。

错误处理

报告 math_errhandling 中指定的错误。

若实现支持 IEEE 浮点算术( IEC 60559 ),则

  • 决不引发 FE_INEXACT ,除非出现值域错误(结果准确)
  • 忽略当前舍入模式,除非出现值域错误
  • arg 为 ±0 ,则返回不修改的参数
  • arg 为 ±∞ ,则返回不修改的参数
  • exp 为 0 ,则返回不修改的 arg
  • arg 为 NaN ,则返回 NaN

注意

二进制系统上(其中 FLT_RADIX2 ), std::ldexp 等价于 std::scalbn

函数 std::ldexp (“加载指数”)与其对偶 std::frexp 能一同用于操纵浮点数的表示,而无需直接的位操作。

多数实现上, std::ldexp 效率低于用通常算术运算符乘或除以二的幂。

示例

#include <iostream>
#include <cmath>
#include <cerrno>
#include <cstring>
#include <cfenv>
 
#pragma STDC FENV_ACCESS ON
int main()
{
    std::cout << "ldexp(7, -4) = " << std::ldexp(7, -4) << '\n'
              << "ldexp(1, -1074) = " << std::ldexp(1, -1074)
              << " (minimum positive subnormal double)\n"
              << "ldexp(nextafter(1,0), 1024) = "
              << std::ldexp(std::nextafter(1,0), 1024)
              << " (largest finite double)\n";
    // 特殊值
    std::cout << "ldexp(-0, 10) = " << std::ldexp(-0.0, 10) << '\n'
              << "ldexp(-Inf, -1) = " << std::ldexp(-INFINITY, -1) << '\n';
    // 错误处理
    errno = 0;
    std::feclearexcept(FE_ALL_EXCEPT);
    std::cout << "ldexp(1, 1024) = " << std::ldexp(1, 1024) << '\n';
    if (errno == ERANGE)
        std::cout << "    errno == ERANGE: " << std::strerror(errno) << '\n';
    if (std::fetestexcept(FE_OVERFLOW))
        std::cout << "    FE_OVERFLOW raised\n";
}

输出:

ldexp(7, -4) = 0.4375
ldexp(1, -1074) = 4.94066e-324 (minimum positive subnormal double)
ldexp(nextafter(1,0), 1024) = 1.79769e+308 (largest finite double)
ldexp(-0, 10) = -0
ldexp(-Inf, -1) = -inf
ldexp(1, 1024) = inf
    errno == ERANGE: Numerical result out of range
    FE_OVERFLOW raised

参阅

(C++11)(C++11)
将数分解为有效数字和 2 的幂次
(函数)
(C++11)(C++11)(C++11)(C++11)(C++11)(C++11)
将数乘以 FLT_RADIX 的幂次
(函数)