C++ 標準ライブラリ<complex>
数学や工学の計算では、信号処理、フーリエ変換、回路解析などで、複素数(complex number)を扱う必要がよくあります。
C++ 標準ライブラリは<complex>ヘッダファイル
を提供しており、普通の数のように簡単に複素数を操作できます。
z = a + bi
複素数は実部(real part)と虚部(imaginary part)から構成され、その形式は次のとおりです:a + bi複素数は実数と虚数の組み合わせであり、通常は次のように表されます:aここで、ba は実部、ib は虚部、i^2 = -1。
i は虚数単位であり、次の式を満たします。std::complex<T>C++ では、複素数型はT任意の算術型にすることができ、例えばfloat、double 或 long double。
を使用するには<complex>ライブラリを、まず C++ プログラムにこのヘッダファイルを含める必要があります:
#include <iostream> #include <complex>
例
#include <iostream>
#include <complex> // 複素数ヘッダファイル
int main() {
std::complex<double> z1(3.0, 4.0); // 3 + 4i
std::complex<double> z2(1.0, -2.0); // 1 - 2i
std::cout << "z1 = " << z1 << std::endl;
std::cout << "z2 = " << z2 << std::endl;
}
#include <complex> // 複素数ヘッダファイル
int main() {
std::complex<double> z1(3.0, 4.0); // 3 + 4i
std::complex<double> z2(1.0, -2.0); // 1 - 2i
std::cout << "z1 = " << z1 << std::endl;
std::cout << "z2 = " << z2 << std::endl;
}
出力:
z1 = (3,4) z2 = (1,-2)
基本構文
複素数を作成
std::complex<double> c(5.0, 3.0); // 创建一个复数 5 + 3i
実部と虚部にアクセス
double realPart = c.real(); // 获取实部 double imagPart = c.imag(); // 获取虚部
複素数の基本演算
C++ 標準ライブラリ<complex>以下の基本演算をサポートしています:
- 加算:
operator+ - 減算:
operator- - 乗算:
operator* - 除算:
operator/ - 共役:
conj - 絶対値:
abs - 偏角:
arg
1、実部と虚部を取得
std::cout << "实部: " << z1.real() << std::endl; // 3 std::cout << "虚部: " << z1.imag() << std::endl; // 4
2、四則演算:
例
auto z3 = z1 + z2; // (4, 2)
auto z4 = z1 - z2; // (2, 6)
auto z5 = z1 * z2; // (11, -2)
auto z6 = z1 / z2; // (-1, 2)
std::cout << "z1 + z2 = " << z3 << std::endl;
std::cout << "z1 * z2 = " << z5 << std::endl;
auto z4 = z1 - z2; // (2, 6)
auto z5 = z1 * z2; // (11, -2)
auto z6 = z1 / z2; // (-1, 2)
std::cout << "z1 + z2 = " << z3 << std::endl;
std::cout << "z1 * z2 = " << z5 << std::endl;
3、よく使う関数
ヘッダファイル<complex>複素数に関連する多くの数学関数を提供しています。
例
#include <cmath> // 一部の数学関数で必要
std::cout << "絶対値 |z1| = " << std::abs(z1) << std::endl; // 5
std::cout << "偏角 arg(z1) = " << std::arg(z1) << std::endl; // 0.927 (ラジアン)
std::cout << "共役 conjugate(z1) = " << std::conj(z1) << std::endl; // (3,-4)
std::cout << "exp(z1) = " << std::exp(z1) << std::endl; // e^(3+4i)
std::cout << "sin(z1) = " << std::sin(z1) << std::endl;
std::cout << "cos(z1) = " << std::cos(z1) << std::endl;
std::cout << "絶対値 |z1| = " << std::abs(z1) << std::endl; // 5
std::cout << "偏角 arg(z1) = " << std::arg(z1) << std::endl; // 0.927 (ラジアン)
std::cout << "共役 conjugate(z1) = " << std::conj(z1) << std::endl; // (3,-4)
std::cout << "exp(z1) = " << std::exp(z1) << std::endl; // e^(3+4i)
std::cout << "sin(z1) = " << std::sin(z1) << std::endl;
std::cout << "cos(z1) = " << std::cos(z1) << std::endl;
4、極座標表示
場合によっては、極座標(絶対値 + 偏角)を使って複素数を表す必要があります。
例
// 極座標から複素数を生成
double r = 5.0; // 絶対値
double theta = M_PI / 4; // 45 度
std::complex<double> z = std::polar(r, theta);
std::cout << "極座標の複素数 z = " << z << std::endl; // (3.53553,3.53553)
double r = 5.0; // 絶対値
double theta = M_PI / 4; // 45 度
std::complex<double> z = std::polar(r, theta);
std::cout << "極座標の複素数 z = " << z << std::endl; // (3.53553,3.53553)
5、テンプレートパラメータ
std::complex<T>はテンプレートクラスであり、さまざまな数値型をサポートしています:
std::complex<float>std::complex<double>(よく使う)std::complex<long double>
例
std::complex<float> zf(1.0f, 2.0f);
std::complex<double> zd(1.0, 2.0);
std::complex<double> zd(1.0, 2.0);
例
以下は、<complex>ヘッダファイルを使用した簡単な例で、複素数の作成、基本演算、出力結果を含みます。
例
#include <iostream>
#include <complex>
int main() {
// 2つの複素数を作成
std::complex<double> c1(5.0, 3.0); // 5 + 3i
std::complex<double> c2(2.0, -4.0); // 2 - 4i
// 複素数を出力
std::cout << "c1: " << c1 << std::endl; // (5,3)
std::cout << "c2: " << c2 << std::endl; // (2,-4)
// 複素数の加算
std::complex<double> sum = c1 + c2;
std::cout << "Sum: " << sum << std::endl; // 7 - i
// 複素数の減算
std::complex<double> diff = c1 - c2;
std::cout << "Difference: " << diff << std::endl; // 3 + 7i
// 複素数の乗算
std::complex<double> product = c1 * c2;
std::cout << "Product: " << product << std::endl; // 22 - 14i
// 複素数の除算
std::complex<double> quotient = c1 / c2;
std::cout << "Quotient: " << quotient << std::endl; // -0.1 + 1.3i
// 複素数の共役
std::complex<double> conjugate = std::conj(c1);
std::cout << "Conjugate of c1: " << conjugate << std::endl; // 5 - 3i
// 複素数の絶対値
double modulus = std::abs(c1);
std::cout << "Modulus of c1: " << modulus << std::endl; // sqrt(34) ≈ 5.83095
// 複素数の偏角(ラジアン)
double argument = std::arg(c1);
std::cout << "Argument of c1: " << argument << std::endl; // atan(3/5) ≈ 0.54042 rad
return 0;
}
#include <complex>
int main() {
// 2つの複素数を作成
std::complex<double> c1(5.0, 3.0); // 5 + 3i
std::complex<double> c2(2.0, -4.0); // 2 - 4i
// 複素数を出力
std::cout << "c1: " << c1 << std::endl; // (5,3)
std::cout << "c2: " << c2 << std::endl; // (2,-4)
// 複素数の加算
std::complex<double> sum = c1 + c2;
std::cout << "Sum: " << sum << std::endl; // 7 - i
// 複素数の減算
std::complex<double> diff = c1 - c2;
std::cout << "Difference: " << diff << std::endl; // 3 + 7i
// 複素数の乗算
std::complex<double> product = c1 * c2;
std::cout << "Product: " << product << std::endl; // 22 - 14i
// 複素数の除算
std::complex<double> quotient = c1 / c2;
std::cout << "Quotient: " << quotient << std::endl; // -0.1 + 1.3i
// 複素数の共役
std::complex<double> conjugate = std::conj(c1);
std::cout << "Conjugate of c1: " << conjugate << std::endl; // 5 - 3i
// 複素数の絶対値
double modulus = std::abs(c1);
std::cout << "Modulus of c1: " << modulus << std::endl; // sqrt(34) ≈ 5.83095
// 複素数の偏角(ラジアン)
double argument = std::arg(c1);
std::cout << "Argument of c1: " << argument << std::endl; // atan(3/5) ≈ 0.54042 rad
return 0;
}
上記のプログラムを実行すると、次の出力が得られます:
c1: (5,3) c2: (2,-4) Sum: (7,-1) Difference: (3,7) Product: (22,-14) Quotient: (-0.1,1.3) Conjugate of c1: (5,-3) Modulus of c1: 5.83095 Argument of c1: 0.54042その他の拡張