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 的情况。此时,替换类型需具备以下特性:
-
- 提供了 const 成员函数的所有 std::valarray 。
- 可以从替换类型构造 std::valarray 、 std::slice_array 、 std::gslice_array 、 std::mask_array 和 std::indirect_array 。
- 对于每个接受 const std:: valarray < T > & 的函数(除 begin() 和 end() 外 (自 C++11 起) ),应添加接受替换类型的相同函数;
- 对于每个接受两个 const std:: valarray < T > & 参数的函数,应添加接受 const std:: valarray < T > & 与替换类型所有组合的相同函数。
- 返回类型不会在最深嵌套的参数类型基础上增加超过两层的模板嵌套。
可能的实现
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
)
(函数) |
|
在右半平面范围内的复数平方根
(函数模板) |