std::complex
std::complex 是 C++ 标准库中用于处理复数的模板类,主要定义在 <complex>
头文件中。它非常适合进行科学计算、信号处理等领域所需的复数运算。
下面我们通过一个可执行的示例程序来详细了解 std::complex
的主要用法。
#include <iostream>
#include <complex>
#include <cmath> // 用于M_PI等常数int main() {// 1. 构造复数std::complex<double> z1(3.0, 4.0); // 3 + 4istd::complex<double> z2(1.0, -2.0); // 1 - 2istd::complex<double> z_from_real(5.0); // 5 + 0i (仅提供实部,虚部默认为0)std::cout << "z1: " << z1 << std::endl;std::cout << "z2: " << z2 << std::endl;std::cout << "z_from_real: " << z_from_real << "\n\n";// 2. 访问和修改实部与虚部std::cout << "Real part of z1: " << z1.real() << std::endl; // 获取实部std::cout << "Imaginary part of z1: " << z1.imag() << std::endl; // 获取虚部z1.real(10.0); // 修改实部为10.0z1.imag(0.0); // 修改虚部为0.0std::cout << "Modified z1: " << z1 << "\n\n";// 恢复z1的值z1.real(3.0);z1.imag(4.0);// 3. 基本算术运算std::complex<double> sum = z1 + z2;std::complex<double> difference = z1 - z2;std::complex<double> product = z1 * z2;std::complex<double> quotient = z1 / z2;std::cout << "Sum (z1 + z2): " << sum << std::endl;std::cout << "Difference (z1 - z2): " << difference << std::endl;std::cout << "Product (z1 * z2): " << product << std::endl;std::cout << "Quotient (z1 / z2): " << quotient << "\n\n";// 4. 常用数学函数double magnitude = std::abs(z1); // 模长 |z1| = sqrt(real^2 + imag^2)double phase = std::arg(z1); // 相位角 (辐角)std::complex<double> conjugate = std::conj(z1); // 共轭复数 (实部相同,虚部相反)double norm_value = std::norm(z1); // 模长的平方 (real^2 + imag^2)std::cout << "Magnitude of z1: " << magnitude << std::endl;std::cout << "Phase (angle) of z1: " << phase << " radians" << std::endl;std::cout << "Conjugate of z1: " << conjugate << std::endl;std::cout << "Norm of z1 (|z1|^2): " << norm_value << "\n\n";// 5. 极坐标转换// 从极坐标构造复数: 模长为5,相位角为π/4 (45度)std::complex<double> z_polar = std::polar(5.0, M_PI / 4);std::cout << "Complex from polar (r=5, θ=π/4): " << z_polar << std::endl;// 获取复数的极坐标参数std::cout << "Radius of z_polar: " << std::abs(z_polar) << std::endl;std::cout << "Angle of z_polar: " << std::arg(z_polar) << " radians\n\n";// 6. 其他数学运算std::complex<double> exp_z = std::exp(z1); // 指数函数 e^(z1)std::complex<double> log_z = std::log(z1); // 自然对数 ln(z1)std::complex<double> pow_z = std::pow(z1, 2); // 幂函数 z1^2std::complex<double> sin_z = std::sin(z1); // 正弦函数 sin(z1)std::cout << "exp(z1): " << exp_z << std::endl;std::cout << "log(z1): " << log_z << std::endl;std::cout << "z1^2: " << pow_z << std::endl;std::cout << "sin(z1): " << sin_z << "\n\n";// 7. 复数与实数的混合运算std::complex<double> z_real_mixed = z1 + 2.5; // 复数与实数相加std::cout << "z1 + 2.5: " << z_real_mixed << std::endl;return 0;
}
要编译和运行这个程序,你可以使用g++编译器(确保使用C++11或更高标准):
g++ -std=c++11 -o complex_example complex_example.cpp
./complex_example
💡 一些说明与注意事项:
- 模板类型:
std::complex
是一个模板类,你可以根据需要选择float
,double
或long double
作为底层类型,例如std::complex<float>
或std::complex<long double>
,以满足不同场景下对精度和内存的需求。 - 输入/输出:
std::cin
和std::cout
支持std::complex
对象的输入和输出。输出格式默认为(real,imaginary)
,输入时也需要遵循类似的格式。 - 性能与稳定性:对于性能敏感的应用,可以考虑使用
std::norm
来获取模长的平方以避免开方运算,并在处理数值范围相差很大的实部和虚部时注意数值稳定性问题。 - C++20 比较操作:从 C++20 开始,你可以直接使用
==
和!=
来比较两个复数是否相等(实部和虚部分别相等)。
希望这个详细的示例和解释能帮助你更好地理解和使用 std::complex
。如果你在特定的运算或应用场景中遇到问题,欢迎提出!