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