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();
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 $ |
桂田 祐史