1. 程式人生 > >標準C++複數運算類詳解及使用例程

標準C++複數運算類詳解及使用例程

    在C++中複數運算可以通過兩種方式來實現:

    1)標準C++複數運算庫:complex<typedef> ObjectName(realPart, imagePart);

    2)自定義複數運算類:包括複數的實部、虛部、四則運算、模運算、共軛等。

    後者可以根據需要自己定義,關於類的定義這裡不再說明,具體的功能可以根據自己的需要去實現。這裡介紹C++標準的複數運算類complex,網上已經有一些關於complex類的簡單介紹,但大多都是比較粗略的說明,並沒有提供完整而詳細的介紹。這裡參考了網上的一些資源,首先介紹complex類的定義,包括:物件的構造方法、算術運算、賦值運算子、指數運算、對數運算、冪運算、三角函式運算、輸入輸出過載等,然後給出了一個使用例程,用於對其使用方法的總結使用者總結。

一、complex類簡介

    C++複數運算由標準C++複數運算庫(complex number mathematics library)來實現。complex類定義了標準的輸入輸出運算、算是運算、關係運算和賦值運算,同時還包括指數運算、對數運算、冪運算、平方根、三角函式(正弦,餘弦,雙曲正弦,雙曲餘弦)等,還包括笛卡爾座標系到極座標系轉換的函式。

二、檔案包含

1、 #include <complex.h>

2、 #include <math.h>

三、構造方法

1、complex為模板類,因此在定義一個複數時需要制定變數型別,如complex<double> cm(1,1);

2、定義時實部和虛部引數可以使用變數,如:

double a = 1;
double b = 1;
complex<double> cm(a, b);


3、以下定義均合法:

    a) complex(): complex<double> c1;// c1 = (0,0);

    b) complex(double real, double<double> imag = 0.0): complex c2(1.0);// c2 = (1.0,0);

    c) complex<double> c3 = 3.4; // c3 = (3.4,0);

    d) complex c4 = 3.4 + complex(1.2, 3.5);

四、笛卡爾座標系和極座標系下有關函式

1、real();: friend double real(complex a);

2、 img();: friend double imag(complex a);

3、 abs();: friend double abs(complex a);

4、 norm();: friend double norm(complex a);

5、 arg();: friend double arg(complex a);

6、 conj();: friend complex conj(complex a);

7、 polar();: friend complex polar(double r,double t);

示例:

d = real(a);// 返回複數a的實部
d = imag(a);// 返回複數a的虛部
d = abs(a);// 返回複數a的模值/幅值
d = norm(a);// 返回複數a的模值平方
d = arg(a);// 返回複數a的幅角
z = conj(a);// 返回複數a的共軛複數
z = polar(r,t);// 複數的極座標定義方式,r為幅值,t為幅角


五、指數、對數、冪、平方根運算函式

1、 exp(); friend complex exp(complex a);

2、 log(); friend complex log(complex a);

3、 pow(); 四種

        a) friend complex pow(double a, complex b);

        b) friend complex pow(complex a, int b);

        c) friend complex pow(complex a, double b);

        d) friend complex pow(complex a,complex b);

4、 sqrt();friend complex sqrt(complex a);

六、三角關係運算函式

1、 sin(); friend complex sin(complex a);

2、 cos(); friend complex cos(complex a);

3、 sinh(); friend complex sinh(complex a);

4、 cosh(); friend complex cosh(complex a);

七、運算子過載

    運算子過載包括:+、-、*、/(包括+=、-=、*=、/=)、==、!=、<<、>>

八、使用例程

1、開發環境:Win7 (X64) / VS2010

2、建立新專案,編寫程式碼如下:

#include <iostream>
#include <complex>
#include <math.h>

using namespace std;

void main()
{
	// 複數類物件定義
	cout << "複數類物件定義" << endl;
	double r = 1.0;
	double x = 1.0;
	complex<double> c1;
	complex<double> c2(1,1);
	complex<double> c3(r,x);
	complex<double> c4 = 2.0;
	complex<double> c5 = c4 + complex<double>(2,1);

	cout << "c1 = " << c1 << endl;
	cout << "c2 = " << c2 << endl;
	cout << "c3 = " << c3 << endl;
	cout << "c4 = " << c4 << endl;
	cout << "c5 = " << c5 << endl << endl;

	// 笛卡爾座標系和極座標系下有關函式
	cout << "笛卡爾座標系和極座標系下有關函式" << endl;
	cout << "c5實部real:" << c5.real() << endl;
	cout << "c5虛部imag:" << c5.imag() << endl;
	cout << "c5模值abs:" << abs(c5) << endl;
	cout << "c5模值平方norm:" << norm(c5) << endl;
	cout << "c5幅角arg:" << arg(c5) << endl;
	cout << "c5共軛複數conj:" << conj(c5) << endl;
	complex<double> z = polar(1.0, 3.14/6);
	cout << "複數極座標定義polar:" << z << endl << endl;

	// 運算子過載,四則運算
	cout << "運算子過載,四則運算" << endl;
	cout << "c2 + c5 = " << c2 + c5 << endl;
	cout << "c2 - c5 = " << c2 - c5 << endl;
	cout << "c2 * c5 = " << c2 * c5 << endl;
	cout << "c2 / c5 = " << c2 / c5 << endl << endl;

	system("pause");
}

3、執行結果如圖1所示:


圖1

參考:

1)http://blog.chinaunix.net/uid-20559667-id-1924707.html

2)http://blog.csdn.net/qhs1573/article/details/12254205