最終更新日時:
が更新

履歴 編集

function template
<complex>

std::proj(C++11)

namespace std {
  template <class T>
  complex<T> proj(const complex<T>& x);

  complex<Promoted> proj(Arithmetic x); // 追加のオーバーロード:C++11 から
}

概要

リーマン球面への射影(備考参照)を得る。proj は projection(射影、投射)の略。

なお、C++11 で追加されたオーバーロードは、以下のように規定されている。

  • 実引数の型が long double の場合、complex<long double> にキャストされているかのように振る舞う。
  • そうでなくて、実引数の型が double か整数型の場合、complex<double> にキャストされているかのように振る舞う。
  • そうでなくて、実引数の型が float の場合、complex<float> にキャストされているかのように振る舞う。

また、これらの追加のオーバーロードが関数テンプレートなのか否か、あるいは、引数が参照型なのか否かなどについては、規格では何も言及されていない。

戻り値

引数 x のリーマン球面への射影

備考

  • 本関数は、C99 の規格にある cproj(より正確には complex.h ヘッダの cprojcprojfcprojl の 3 つ。それぞれ C++ の proj<double>proj<float>proj<long double> に相当)と同等である。
  • 本関数は、x が無限大ではない場合、x そのものを返す。ここで「無限大ではない」とは、!isinf(real(x)) && !isinf(imag(x)) である。
    x が無限大の場合、complex<T>(numeric_limits<T>::infinity(), copysign(T(), imag(x))) を返す。

#include <iostream>
#include <complex>
#include <limits>

template <class T>
void print_proj(const std::complex<T>& c)
{
  std::complex<T> result = std::proj(c);

  std::cout << "proj( " << c << " ) = " << result << std::endl;
}

int main()
{
  print_proj(std::complex<double>(1.0, 2.0));
  print_proj(std::complex<double>(std::numeric_limits<double>::infinity(), 0.0));
  print_proj(std::complex<double>(std::numeric_limits<double>::infinity(), -0.0));
  print_proj(std::complex<double>(std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::infinity()));
  print_proj(std::complex<double>(std::numeric_limits<double>::quiet_NaN(), -std::numeric_limits<double>::infinity()));
}

出力例

proj( (1,2) ) = (1,2)
proj( (inf,0) ) = (inf,0)
proj( (inf,-0) ) = (inf,-0)
proj( (nan,inf) ) = (inf,0)
proj( (nan,-inf) ) = (inf,-0)

無限大や NaN の出力は異なる可能性がある。
また、numeric_limits<double>::is_iec559()true でない場合、結果が異なる可能性がある。

バージョン

言語

  • C++11

処理系

備考

  • libstdc++ では(規格通りに)C++11 以降のモードでなければ本関数は使用できないが、libc++ では C++98 モードでも使用することができる。(上記の Clang が C++11 モードになっていないのはそのため)
  • libstdc++ では、通常 glibc の対応する関数を呼び出すが、glibc 2.18 以前のバージョンには NAN の取り扱いに、更に、2.11.* 以前のバージョンには通常の値の取り扱いにもバグがある。 また、glibc を使用していない libstdc++ も 4.9.0 現在、glibc 2.11.* 以前のバージョンと同様のバグがある。

参照

real 複素数の実部を得る。
imag 複素数の虚部を得る。
abs 複素数の絶対値を得る。
arg 複素数の偏角を得る。
norm 複素数体のノルムを得る。
conj 共役複素数を得る。
polar 指定した絶対値と偏角の複素数値を得る。

参照