Namespaces
Variants

std:: sqrt (std::valarray)

From cppreference.net
定义于头文件 <valarray>
template < class T >
valarray < T > sqrt ( const valarray < T > & va ) ;

对于 va 中的每个元素,计算该元素值的平方根。

目录

参数

va - 要应用操作的值数组

返回值

包含 va 中数值平方根的值数组。

注释

使用非限定函数 ( sqrt ) 执行计算。若该函数不可用,由于 实参依赖查找 机制,将采用 std:: sqrt

该函数可以实现为返回类型不同于 std::valarray 的情况。此时,替换类型需具备以下特性:

可能的实现

template<class T>
valarray<T> sqrt(const valarray<T>& va)
{
    valarray<T> other = va;
    for (T& i : other)
        i = sqrt(i);
    return other; // 可能返回代理对象
}

示例

一次性求解多个 三次方程 的所有三个根(其中两个可能是共轭复数根)。

#include <cassert>
#include <complex>
#include <cstddef>
#include <iostream>
#include <numbers>
#include <valarray>
using CD = std::complex<double>;
using VA = std::valarray<CD>;
// 返回给定复数 x 的所有 n 个复数根
VA root(CD x, unsigned n)
{
    const double mag = std::pow(std::abs(x), 1.0 / n);
    const double step = 2.0 * std::numbers::pi / n;
    double phase = std::arg(x) / n;
    VA v(n);
    for (std::size_t i{}; i != n; ++i, phase += step)
        v[i] = std::polar(mag, phase);
    return v;
}
// 返回 v 中每个元素的所有 n 个复数根;输出 valarray 中首先包含 v[0] 的所有 n 个根,然后是 v[1] 的所有 n 个根,依此类推
VA root(VA v, unsigned n)
{
    VA o(v.size() * n);
    VA t(n);
    for (std::size_t i = 0; i != v.size(); ++i)
    {
        t = root(v[i], n);
        for (unsigned j = 0; j != n; ++j)
            o[n * i + j] = t[j];
    }
    return o;
}
// 容忍给定舍入误差的浮点数比较器
inline bool is_equ(CD x, CD y, double tolerance = 0.000'000'001)
{
    return std::abs(std::abs(x) - std::abs(y)) < tolerance;
}
int main()
{
    // 多项式 x³ + p·x + q 的输入系数
    const VA p{1, 2, 3, 4, 5, 6, 7, 8};
    const VA q{1, 2, 3, 4, 5, 6, 7, 8};
    // 求解器
    const VA d = std::sqrt(std::pow(q / 2, 2) + std::pow(p / 3, 3));
    const VA u = root(-q / 2 + d, 3);
    const VA n = root(-q / 2 - d, 3);
    // 为根分配内存:3 * 输入三次多项式的数量
    VA x[3];
    for (std::size_t t = 0; t != 3; ++t)
        x[t].resize(p.size());
    auto is_proper_root = [](CD a, CD b, CD p) { return is_equ(a * b + p / 3.0, 0.0); };
    // 从生成的 9 个根中筛选出 6 个,仅保留 3 个有效根(每个多项式)
    for (std::size_t i = 0; i != p.size(); ++i)
        for (std::size_t j = 0, r = 0; j != 3; ++j)
            for (std::size_t k = 0; k != 3; ++k)
                if</span

参见

对两个 valarray 或一个 valarray 与一个值应用函数 std::pow
(函数模板)
(C++11) (C++11)
计算平方根 ( x )
(函数)
在右半平面范围内的复数平方根
(函数模板)