std::polar(std::complex)
来自 cppreference.com
定义在头文件 <complex> 中 |
||
template< class T > std::complex<T> polar( const T& r, const T& theta = T() ); |
||
返回一个大小为 r、相位角为 theta 的复数。
如果 r 为负数或 NaN,或者如果 theta 为无穷大,则行为未定义。
内容 |
[编辑] 参数
r | - | 大小 |
theta | - | 相位角 |
[编辑] 返回值
由 r 和 theta 决定的复数。
[编辑] 注释
std::polar(r, theta) 等价于以下任何表达式
- r * std::exp(theta * 1i)
- r * (cos(theta) + sin(theta) * 1i)
- std::complex(r * cos(theta), r * sin(theta)).
在矢量化循环中,使用 polar 而不是 exp 大约可以快 4.5 倍。
[编辑] 示例
运行这段代码
#include <cmath> #include <complex> #include <iomanip> #include <iostream> #include <numbers> using namespace std::complex_literals; int main() { constexpr auto π_2{std::numbers::pi / 2.0}; constexpr auto mag{1.0}; std::cout << std::fixed << std::showpos << std::setprecision(1) << " θ: │ polar: │ exp: │ complex: │ trig:\n"; for (int n{}; n != 4; ++n) { const auto θ{n * π_2}; std::cout << std::setw(4) << 90 * n << "° │ " << std::polar(mag, θ) << " │ " << mag * std::exp(θ * 1.0i) << " │ " << std::complex(mag * cos(θ), mag * sin(θ)) << " │ " << mag * (cos(θ) + 1.0i * sin(θ)) << '\n'; } }
输出
θ: │ polar: │ exp: │ complex: │ trig: +0° │ (+1.0,+0.0) │ (+1.0,+0.0) │ (+1.0,+0.0) │ (+1.0,+0.0) +90° │ (+0.0,+1.0) │ (+0.0,+1.0) │ (+0.0,+1.0) │ (+0.0,+1.0) +180° │ (-1.0,+0.0) │ (-1.0,+0.0) │ (-1.0,+0.0) │ (-1.0,+0.0) +270° │ (-0.0,-1.0) │ (-0.0,-1.0) │ (-0.0,-1.0) │ (-0.0,-1.0)
[编辑] 缺陷报告
以下行为改变的缺陷报告被追溯应用于之前发布的 C++ 标准。
DR | 应用于 | 发布的行为 | 正确行为 |
---|---|---|---|
LWG 2459 | C++98 | 对于某些输入,行为不明确 | 被定义为未定义 |
LWG 2870 | C++98 | 参数 theta 的默认值不依赖于 | 使其依赖 |
[编辑] 参见
返回复数的大小 (函数模板) | |
返回相位角 (函数模板) | |
复数基数 e 指数 (函数模板) |