最終更新日時: 2024年06月11日 22時45分38秒 (JST)
Akira Takahashi が更新

履歴 編集

function template
<complex>

# std::polar

    namespace std {
      template <class T>
      complex<T>
        polar(const T& rho,
              const T& theta = 0); // (1) C++03
      template <class T>
      constexpr complex<T>
        polar(const T& rho,
              const T& theta = 0); // (1) C++26
    }

## 概要

複素数を極形式で指定して作る。polar は polar form（極形式）の略。

## 戻り値

絶対値が `rho` で偏角が `theta` の複素数

## 備考

- 規格には、偏角 `theta` の単位については何も記載がない。しかし、この引数の単位がラジアンであることは異論をはさむ余地はないだろう。
  実際、本関数の逆関数（の片割れ）とも言える `arg` の戻り値はラジアンである。
- コンストラクタのデフォルト引数を踏まえると、偏角 `theta` のデフォルト引数が `T()` ではなく `0` であるのは、規格の誤りであるように思われる。
- `rho` と `theta` に現れる型 `T` は（残念ながら）同じ型でなければならない。（`int` と `double` を渡すなどといったことはできない）
  同じ `<complex>` ヘッダの `pow` や、`cmath` ヘッダの `atan2` などの関数群は、引数の型が異なっていても簡単に呼び出せるように C++11 でオーバーロードが追加されているため、単なる規格の考慮漏れかもしれない。

## 例

    #include <iostream>
    #include <complex>
    #include <cmath>

    static const double pi = std::acos(-1.0); // お手軽に π を得る。

    int main()
    {
      std::complex<double> result = std::polar(1.0, pi / 4.0);
      std::cout << "polar(1.0, pi / 4.0) = " << result << std::endl;
    }

### 出力

    polar(1.0, pi / 4.0) = (0.707107,0.707107)

## バージョン

### 言語

- C++98

### 処理系

- Clang: 3.0 ✅, 3.1 ✅, 3.2 ✅, 3.3 ✅, 3.4 ✅
- GCC: 4.3.6 ✅, 4.4.7 ✅, 4.5.4 ✅, 4.6.4 ✅, 4.7.3 ✅, 4.8.1 ✅, 4.8.2 ✅, 4.9.0 ✅
- ICC: ??
- Visual C++: ??

## 関連項目

名前 | 説明
--- | ---
`real` | 複素数の実部を得る。
`imag` | 複素数の虚部を得る。
`abs` | 複素数の絶対値を得る。
`arg` | 複素数の偏角を得る。
`norm` | 複素数体のノルムを得る。
`conj` | 共役複素数を得る。
`proj` | リーマン球面への射影を得る。

## 参照

- P1383R2 More constexpr for `<cmath>` and `<complex>`
  - C++26で`constexpr`対応した