4.9 複素数

kv::complex というものが用意されている。 標準の std::complex2 と使い方は近い、らしい。

#include <kv/complex.hpp>

kv-version/test/test-complex.cc というサンプル・プログラムがある。 abs(), arg(), conj(), sqrt(), pow(), exp(), log(), sin(), cos(), tan(), asin(), acos(), atan(), sinh(), cosh(), tanh(), asinh(), acosh(), atanh() などが使えることをデモしている。

そこで無視されている、 実部、虚部の取り出し方が気になったので、チェックしてみる。 まずは std::complex の方から。

  std::complex<double> z;
だとして、実部、虚部の取り出しは
  x=std::real(z); y=std::imag(z);
あるいは
  x=z.real(); y=z.imag();
mytest-std-complex.cc

/*
 * mytest-std-complex.cc
 *  g++ mytest-std-complex.cc
 */

#include <iostream>
#include <complex>

int main(void)
{
  std::complex<double> z(1,2);
  double x, y;
  // 実部と虚部の取り出し (1)
  x = std::real(z);
  y = std::imag(z);
  std::cout << z << " の実部=" << x << ", 虚部=" << y << std::endl;
  // 実部と虚部の取り出し (2)
  x = z.real();
  y = z.imag();
  std::cout << z << " の実部=" << x << ", 虚部=" << y << std::endl;
  return 0;
}
mytest-std-complex.ccのコンパイル&実行
$ g++ mytest-std-complex.cc
$ ./a.out
(1,2) の実部=1, 虚部=2
(1,2) の実部=1, 虚部=2
$

次は kv::complex の方。

  kv::complex<double> z;
だとして、実部、虚部の取り出しは
  x=z.real(); y=z.imag();
というやり方のみ? kv::real(z)kv::complex.real(z) みたいのはないみたい。
mytest-kv-complex.cc

/*
 * mytest-kv-complex.cc
 *  g++ -I/opt/local/include mytest-std-complex.cc
 */

#include <iostream>
#include <kv/complex.hpp>

int main(void)
{
  kv::complex<double> z(1,2);
  double x, y;
  // 実部と虚部の取り出し (1)
  // x = kv::real(z);
  // y = kv::imag(z);
  // x = kv::complex.real(z);
  // y = kv::complex.imag(z);
  // std::cout << z << " の実部=" << x << ", 虚部=" << y << std::endl;
  // 実部と虚部の取り出し (2)
  x = z.real();
  y = z.imag();
  std::cout << z << " の実部=" << x << ", 虚部=" << y << std::endl;
  return 0;
}

mytest-kv-complex.ccのコンパイル&実行
$ g++ -I/opt/local/include mytest-kv-complex.cc
$ ./a.out
(1)+(2)i の実部=1, 虚部=2
$
複素数の表示の仕方も違っていることに注意しよう。 std::complex では ($ x$ ,$ y$ ) だけれど、 kv::complex では ($ x$ )+($ y$ )i だ。

桂田 祐史
2016-03-04