Namespaces
Variants

std:: polar (std::complex)

From ja.cppreference.net
ヘッダーで定義 <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 ) ) .
(注:指定された条件により、HTMLタグ・属性、タグ内のテキスト、C++固有の用語は翻訳せず、元のフォーマットを保持しています。上記のコード部分はすべて翻訳対象外のため、日本語訳は不要です。)

極座標形式を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 の指数関数
(関数テンプレート)