00001 #ifndef __RComplex_H__
00002 #define __RComplex_H__
00003
00004
00005
00024 #include <stdio.h>
00025 #include <math.h>
00026
00027 class RComplex
00028 {
00029 public:
00030
00031 double a;
00032 double b;
00033
00034 public:
00035
00036 RComplex(){ a=0.0; b=0.0; }
00037 RComplex(double real, double img=0.0){ a=real; b=img; }
00038 RComplex(double root, double theta, int sign){ a=root*cos(sign*theta); b=root*sin(sign*theta); }
00039 RComplex(const RComplex& x){ a=x.a; b=x.b; }
00040 RComplex& operator=(const RComplex& x){ a=x.a; b=x.b; return *this; }
00041
00042 ~RComplex(){}
00043
00044 inline double getReal(){return a;}
00045 inline double getImg(){return b;}
00046
00047 double getRoot(){ return ::sqrt( a*a + b*b ); }
00048 double getAbs(){ return ::sqrt( a*a + b*b ); }
00049 double getArg();
00050
00051 inline RComplex conjugate(){ return RComplex(a, -b); }
00052
00053
00054
00055 RComplex sqrt();
00056 RComplex pow(double pow);
00057 RComplex sqr(){ RComplex x(a*a-b*b, 2.0*a*b); return x; }
00058 RComplex exp(){ double ex= ::exp(a); RComplex x( ex*cos(b), ex*sin(b) ); return x; }
00059 RComplex log();
00060
00061
00062
00063 void operator+=(double value){ a += value; }
00064 void operator-=(double value){ a -= value; }
00065 void operator*=(double value){ a *= value; b *= value; }
00066 void operator/=(double value){ a /= value; b /= value; }
00067
00068
00069 void operator+=(const RComplex& v){ a += v.a; b += v.b; }
00070 void operator-=(const RComplex& v){ a -= v.a; b -= v.b; }
00071 void operator*=(const RComplex& v){ RComplex x(a*v.a-b*v.b, a*v.b + b*v.a); *this=x; }
00072 void operator/=(const RComplex& v){ RComplex x(a*v.a+b*v.b, a*v.b - b*v.a); x/=(v.a*v.a+v.b*v.b); *this=x; }
00073
00074
00075 friend RComplex operator+(const RComplex& v, double a);
00076 friend RComplex operator+(double a, const RComplex& v);
00077 friend RComplex operator-(const RComplex& v, double a);
00078 friend RComplex operator-(double a, const RComplex& v);
00079 friend RComplex operator*( const RComplex& v, double a);
00080 friend RComplex operator*(double a,const RComplex& v);
00081 friend RComplex operator/(const RComplex& v, double a);
00082
00083 friend RComplex operator+(const RComplex& v1, const RComplex& v2);
00084 friend RComplex operator-(const RComplex& v1, const RComplex& v2);
00085 friend RComplex operator*(const RComplex& v1, const RComplex& v2);
00086 friend RComplex operator/(const RComplex& v1, const RComplex& v2);
00087
00088 void output(){printf("(%f, i*%f)", a, b);}
00089 void output(FILE* file){fprintf(file, "(%f, i*%f)", a, b);}
00090 };
00091
00092 #endif
00093
00094