# std::pow, std::powf, std::powl

< cpp‎ | numeric‎ | math

定义于头文件 `<cmath>` |  |
| (1) |
float pow ( float base, float exp ); |  |
float powf( float base, float exp ); |  | (C++11 起)
double pow ( double base, double exp ); | (2) |
| (3) |
long double pow ( long double base, long double exp ); |  |
long double powl( long double base, long double exp ); |  | (C++11 起)
float pow ( float base, int iexp ); | (4) | (C++11 前)
double pow ( double base, int iexp ); | (5) | (C++11 前)
long double pow ( long double base, int iexp ); | (6) | (C++11 前)
Promoted pow ( Arithmetic1 base, Arithmetic2 exp ); | (7) | (C++11 起)

1-6) 计算 `base` 的 `exp` 或 `iexp` 次幂。
7) 1-3) 所不覆盖的所有算术类型组合的重载集或函数模板。若任何参数拥有整数类型，则将它转型为 double 。若任何参数为 long double ，则返回类型 `Promoted` 亦为 long double ，否则返回类型始终为 double 。

### 参数

base | - | 作为底数的浮点或整数类型值
exp | - | 作为指数的浮点或整数类型值
iexp | - | 整数值指数

### 返回值

若不出现错误，则返回 `base` 的 `exp` 次幂（ baseexp
）。

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

若出现极点错误或上溢所致的值域错误，则返回 `±HUGE_VAL` 、 `±HUGE_VALF` 或 `±HUGE_VALL` 。

若出现下溢所致的值域错误，则返回（舍入后的）正确结果。

### 错误处理

报告 math_errhandling 中指定的错误。

若 `base` 有限且为负，且 `exp` 有限且为非整数，则出现定义域错误，并可能出现值域错误。

若 `base` 为零且 `exp` 为零，则可能出现定义域错误。

若 `base` 为零且 `exp` 为负，则可能出现定义域错误或极点错误。

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

- pow(+0, exp) ，其中 `exp` 为负奇数，返回 `+∞` 并引发 FE_DIVBYZERO
- pow(-0, exp) ，其中 `exp` 为负奇数，返回 `-∞` 并引发 FE_DIVBYZERO
- pow(±0, exp) ，其中 `exp` 为有限负数，且为偶数或非整数，则返回 +∞ 并引发 FE_DIVBYZERO
- pow(±0, -∞) 返回 +∞ 并可能引发 FE_DIVBYZERO
- pow(+0, exp) ，其中 `exp` 为正奇数，返回 +0
- pow(-0, exp) ，其中 `exp` 为正奇数，返回 -0
- pow(±0, exp) ，其中 `exp` 为正非整数或正偶数，返回 +0
- pow(-1, ±∞) 返回 `1`
- pow(+1, exp) 对于任何 `exp` 返回 `1` ，即使 `exp` 为 `NaN`
- pow(base, ±0) 对于任何 `base` 返回 `1` ，即使 `base` 为 `NaN`
- pow(base, exp) 返回 `NaN` 并引发 FE_INVALID ，若 `base` 为有限负数且 `exp` 为有限非整数。
- pow(base, -∞) 对任何 `|base|<1` 返回 +∞
- pow(base, -∞) 对任何 `|base|>1` 返回 +0
- pow(base, +∞) 对任何 `|base|<1` 返回 +0
- pow(base, +∞) 对任何 `|base|>1` 返回 +∞
- pow(-∞, exp) 返回 -0 ，若 `exp` 为负奇整数
- pow(-∞, exp) 返回 +0 ，若 `exp` 为负非整数或负偶数
- pow(-∞, exp) 返回 -∞ ，若 `exp` 为正奇整数
- pow(-∞, exp) 返回 +∞ ，若 `exp` 为正非整数或正偶数
- pow(+∞, exp) 对任何 `exp` 返回 +0
- pow(+∞, exp) 对任何 `exp` 返回 +∞
- 除了指定于上处，若任何参数为 NaN ，则返回 NaN

### 注意

`pow(float, int)` 在 C++11 前返回 float （由重载 4 ）但从 C++11 起返回 double （由重载 7 ）。

尽管 `std::pow` 不能获得负数的开方根， `exp` 为 1/3 的常用情况还提供了 std::cbrt 。

### 示例

    #include <iostream>
    #include <cmath>
    #include <cerrno>
    #include <cfenv>
    #include <cstring>

    #pragma STDC FENV_ACCESS ON
    int main()
    {
        // 通常用法
        std::cout << "pow(2, 10) = " << std::pow(2,10) << '\n'
                  << "pow(2, 0.5) = " << std::pow(2,0.5) << '\n'
                  << "pow(-2, -3) = " << std::pow(-2,-3) << '\n';
        // 特殊值
        std::cout << "pow(-1, NAN) = " << std::pow(-1,NAN) << '\n'
                  << "pow(+1, NAN) = " << std::pow(+1,NAN) << '\n'
                  << "pow(INFINITY, 2) = " << std::pow(INFINITY, 2) << '\n'
                  << "pow(INFINITY, -1) = " << std::pow(INFINITY, -1) << '\n';
        // 错误处理
        errno = 0;
        std::feclearexcept(FE_ALL_EXCEPT);
        std::cout << "pow(-1, 1/3) = " << std::pow(-1, 1.0/3) << '\n';
        if (errno == EDOM)
            std::cout << "    errno == EDOM " << std::strerror(errno) << '\n';
        if (std::fetestexcept(FE_INVALID))
            std::cout << "    FE_INVALID raised\n";

        std::feclearexcept(FE_ALL_EXCEPT);
        std::cout << "pow(-0, -3) = " << std::pow(-0.0, -3) << '\n';
        if (std::fetestexcept(FE_DIVBYZERO))
            std::cout << "    FE_DIVBYZERO raised\n";
    }

可能的输出：

    pow(2, 10) = 1024
    pow(2, 0.5) = 1.41421
    pow(-2, -3) = -0.125
    pow(-1, NAN) = nan
    pow(+1, NAN) = 1
    pow(INFINITY, 2) = inf
    pow(INFINITY, -1) = 0
    pow(-1, 1/3) = -nan
        errno == EDOM Numerical argument out of domain
        FE_INVALID raised
    pow(-0, -3) = -inf
        FE_DIVBYZERO raised

### 参阅

sqrt sqrtf sqrtl (C++11)(C++11) | 计算平方根（ \(\small{\sqrt{x} }\)√x ） (函数)
cbrt cbrtf cbrtl (C++11)(C++11)(C++11) | 计算立方根（ \(\small{\sqrt[3]{x} }\)3√x ） (函数)
hypot hypotf hypotl (C++11)(C++11)(C++11) | 计算两个给定数的平方和的平方根（ \(\scriptsize{\sqrt{x^2+y^2} }\)√x2 +y2 ） (函数)
pow(std::complex) | 复数幂，一或两个参数可为复数 (函数模板)
pow(std::valarray) | 应用函数 std::pow 到二个 valarray 或一个 valarray 与一个值 (函数模板)