# std::pow(std::valarray)

< cpp‎ | numeric‎ | valarray

定义于头文件 `<valarray>` |  |
template< class T > std::valarray<T> pow( const std::valarray<T>& base, const std::valarray<T>& exp ); | (1) |
template< class T > std::valarray<T> pow( const std::valarray<T>& base, const typename std::valarray<T>::value_type& vexp ); | (2) |
template< class T > std::valarray<T> pow( const typename std::valarray<T>::value_type& vbase, const std::valarray<T>& exp ); | (3) |

计算值的幂。

1) 计算数值数组 `base` 中的元素的幂，指数由来自数值数组 `exp` 的对应元素指定。

若 base.size() != exp.size() 则行为未定义。

2) 计算数值数组 `base` 中每个元素的 `vexp` 次幂。
3) 计算 `vbase` 的值以数值数组 `exp` 中的元素定义次数的幂。

### 参数

base | - | 含底数值的数值数组
exp | - | 含指数值的数值数组
vbase | - | 定义底数的值
vexp | - | 定义指数的值

### 返回值

含有指数结果的数值数组。

### 注解

用无限定函数 (pow) 进行计算。若该函数不可用，则因参数依赖查找使用 std::pow 。

函数能实现为拥有不同于 std::valarray 的返回类型。此情况下，替换类型拥有下列属性：

  - 提供 std::valarray 的所有 const 成员函数。
  - 能从替换类型构造 std::valarray 、 std::slice_array 、 std::gslice_array 、 std::mask_array 和 std::indirect_array 。
  - 所有接受一个 const std::valarray& 类型参数的函数，除了 `begin()` 和 `end()` (C++11 起)也应该接受替换类型。
  - 所有接受二个 const std::valarray& 类型参数的函数都应该接受 const std::valarray& 和替换类型的每种组合。
  - 返回类型添加不多于二层嵌套在最深层嵌套的参数类型上的模板。

### 示例

    #include <cstddef>
    #include <cmath>
    #include <iomanip>
    #include <iostream>
    #include <valarray>

    void render(std::valarray<int> const& bases,
                std::valarray<int> const& exponents = {},
                std::valarray<int> const& results   = {})
    {
        constexpr char const* sup[] {
            "\u2070", "\u00B9", "\u00B2", "\u00B3", "\u2074",
            "\u2075", "\u2076", "\u2077", "\u2078", "\u2079",
        };

        for (std::size_t n = 0; n != bases.size(); ++n) {
            std::cout << std::left << bases[n] << std::left;
            if (n < exponents.size())
                std::cout << sup[exponents[n] % 10] << " ";
            else
                std::cout << "  ";
        }
        if (results.size() != 0) {
            std::cout << "=";
            for (std::size_t n = 0; n != results.size(); ++n) {
                std::cout << " " << results[n];
            }
        }
        std::cout << '\n';
    }

    void render(int n) { std::cout << n << '\n'; }

    int main()
    {
        constexpr int base { 2 };
        constexpr int exponent { 5 };
        const std::valarray<int> bases { 1, 2, 3, 4, 5, 6, 7 };
        const std::valarray<int> exponents { 0, 1, 2, 3, 4, 5, 6 };

        std::cout << "(1) pow( const std::valarray<T>& base, const std::valarray<T>& exp ); \n";
        const std::valarray<int> powers1 = std::pow(bases, exponents);
        std::cout << "base  : "; render(bases);
        std::cout << "exp   : "; render(exponents);
        std::cout << "pow   : "; render(bases, exponents, powers1);

        std::cout << "\n(2) pow( const std::valarray<T>& base, const value_type& vexp ); \n";
        const std::valarray<int> powers2 = std::pow(bases, exponent);
        std::cout << "base  : "; render(bases);
        std::cout << "vexp  : "; render(exponent);
        std::cout << "pow   : "; render(bases, std::valarray<int>(exponent, bases.size()), powers2);

        std::cout << "\n(3) pow( const value_type& vbase, const std::valarray<T>& exp ); \n";
        const std::valarray<int> powers3 = std::pow(base, exponents);
        std::cout << "vbase : "; render(base);
        std::cout << "exp   : "; render(exponents);
        std::cout << "pow   : "; render(std::valarray<int>(base, bases.size()), exponents, powers3);
    }

输出：

    (1) pow( const std::valarray<T>& base, const std::valarray<T>& exp );
    base  : 1  2  3  4  5  6  7
    exp   : 0  1  2  3  4  5  6
    pow   : 1⁰ 2¹ 3² 4³ 5⁴ 6⁵ 7⁶ = 1 2 9 64 625 7776 117649

    (2) pow( const std::valarray<T>& base, const value_type& vexp );
    base  : 1  2  3  4  5  6  7
    vexp  : 5
    pow   : 1⁵ 2⁵ 3⁵ 4⁵ 5⁵ 6⁵ 7⁵ = 1 32 243 1024 3125 7776 16807

    (3) pow( const value_type& vbase, const std::valarray<T>& exp );
    vbase : 2
    exp   : 0  1  2  3  4  5  6
    pow   : 2⁰ 2¹ 2² 2³ 2⁴ 2⁵ 2⁶ = 1 2 4 8 16 32 64

### 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR | 应用于 | 出版时的行为 | 正确行为
--- | --- | --- | ---
LWG 3074 | C++98 | (2-3) 从标量和 `valarray` 两者推导 `T` ，禁止混合类型的调用 | 仅从 `valarray` 推导 `T`

### 参阅

sqrt(std::valarray) | 应用函数 std::sqrt 到 valarray 的每个元素 (函数模板)
pow powf powl (C++11)(C++11) | 求某数的给定次幂（ \(\small{x^y}\)xy ） (函数)
pow(std::complex) | 复数幂，一或两个参数可为复数 (函数模板)