# std::log2, std::log2f, std::log2l

< cpp‎ | numeric‎ | math

定义于头文件 `<cmath>` |  |
float log2 ( float arg ); float log2f( float arg ); | (1) | (C++11 起)
double log2 ( double arg ); | (2) | (C++11 起)
long double log2 ( long double arg ); long double log2l( long double arg ); | (3) | (C++11 起)
double log2 ( IntegralType arg ); | (4) | (C++11 起)

1-3) 计算 `arg` 的底 2 对数。
4) 接受任何整数类型参数的重载集或函数模板。等价于 2) （将参数转型为 double ）。

### 参数

arg | - | 浮点或整数类型值

### 返回值

若不出现错误，则返回 `arg` 的底 2 对数（ log
2(arg) 或 lb(arg) ）。

若出现定义域错误，则返回实现定义值（支持的平台上为 NaN ）。

若出现极点错误，则返回 `-HUGE_VAL` 、 `-HUGE_VALF` 或 `-HUGE_VALL` 。

### 错误处理

报告 math_errhandling 中指定的错误。

若 `arg` 小于零则出现定义域错误。

若 `arg` 为零则可能出现极点错误。

若实现支持 IEEE 浮点算术（ IEC 60559 ），则

- 若参数为 ±0 ，则返回 -∞ 并引发 FE_DIVBYZERO 。
- 若参数为 1 ，则返回 +0 。
- 若参数为负数，则返回 NaN 并引发 FE_INVALID 。
- 若参数为 +∞ ，则返回 +∞ 。
- 若参数为 NaN ，则返回 NaN 。

### 注意

对于整数 `arg` ，二进制对数能转译成输入中最高位 1 的零底下标。

### 示例

    #include <iostream>
    #include <cmath>
    #include <cerrno>
    #include <cstring>
    #include <cfenv>
    #pragma STDC FENV_ACCESS ON
    int main()
    {
        std::cout << "log2(65536) = " << std::log2(65536) << '\n'
                  << "log2(0.125) = " << std::log2(0.125) << '\n'
                  << "log2(0x020f) = " << std::log2(0x020f)
                  << " (highest set bit is in position 9)\n"
                  << "base-5 logarithm of 125 = " << std::log2(125)/std::log2(5) << '\n';
        // 特殊值
        std::cout << "log2(1) = " << std::log2(1) << '\n'
                  << "log2(+Inf) = " << std::log2(INFINITY) << '\n';
        // 错误处理
        errno = 0;
        std::feclearexcept(FE_ALL_EXCEPT);
        std::cout << "log2(0) = " << std::log2(0) << '\n';
        if (errno == ERANGE)
            std::cout << "    errno == ERANGE: " << std::strerror(errno) << '\n';
        if (std::fetestexcept(FE_DIVBYZERO))
            std::cout << "    FE_DIVBYZERO raised\n";
    }

可能的输出：

    log2(65536) = 16
    log2(0.125) = -3
    log2(0x020f) = 9.04166 (highest set bit is in position 9)
    base-5 logarithm of 125 = 3
    log2(1) = 0
    log2(+Inf) = inf
    log2(0) = -inf
        errno == ERANGE: Numerical result out of range
        FE_DIVBYZERO raised

### 参阅

log logf logl (C++11)(C++11) | 计算自然（以 e 为底）对数（ \({\small \ln{x} }\)ln(x) ） (函数)
log10 log10f log10l (C++11)(C++11) | 计算常用（以 10 为底）对数（ \({\small \log_{10}{x} }\)log10(x) ） (函数)
log1p log1pf log1pl (C++11)(C++11)(C++11) | 1 加上给定数值的自然（以 e 为底）对数（ \({\small \ln{(1+x)} }\)ln(1+x) ） (函数)
exp2 exp2f exp2l (C++11)(C++11)(C++11) | 返回 2 的给定次幂（ \({\small 2^x}\)2x ） (函数)