std::pow(std::valarray)

来自cppreference.com
< 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 的返回类型。此情况下,替换类型拥有下列属性:

示例

#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

参阅

应用函数 std::sqrt 到 valarray 的每个元素
(函数模板)
(C++11)(C++11)
求某数的给定次幂( xy
(函数)
复数幂,一或两个参数可为复数
(函数模板)