00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef DifComplex_H
00024 #define DifComplex_H
00025
00026 #include <assert.h>
00027 #include <stdlib.h>
00028 #include "MdcRecoUtil/DifNumber.h"
00029
00030 class ostream;
00031
00032 class DifComplex {
00033
00034 public:
00035
00036
00037 inline DifComplex();
00038 inline DifComplex(const DifNumber& r);
00039 inline DifComplex(double r);
00040 inline DifComplex(const DifNumber& r,const DifNumber& i);
00041 inline DifComplex(double r,double i);
00042 inline DifComplex(const DifComplex& c);
00043
00044
00045 inline const DifNumber& real()const {return _r;}
00046 inline DifNumber& gimeReal(){return _r;}
00047 inline const DifNumber& imag()const {return _i;}
00048 inline DifNumber& gimeImag(){return _i;}
00049
00050
00051 void setReal(const DifNumber& r) {_r=r;}
00052 void setImag(const DifNumber& i) {_i=i;}
00053
00054
00055 inline DifComplex& operator+=(const DifComplex& a);
00056 inline DifComplex& operator-=(const DifComplex& a);
00057 inline DifComplex& operator*=(const DifComplex& a);
00058 inline DifComplex& operator/=(const DifComplex& a);
00059 inline DifComplex& operator/=(const DifNumber& a);
00060 inline DifComplex& operator=(const DifComplex& a);
00061 inline DifComplex operator-()const;
00062
00063
00064 inline DifComplex& conjugate();
00065 inline DifComplex& inverse();
00066 inline DifComplex& flipsign();
00067 inline DifComplex& takeLog();
00068 inline DifComplex& power(const DifNumber& p);
00069 inline DifComplex& power(const DifComplex& p);
00070
00071
00072 inline DifNumber mag()const;
00073 inline DifNumber magsq()const;
00074 inline DifNumber arg()const;
00075 inline DifNumber phase()const {return arg();}
00076
00077
00078 inline void print()const;
00079
00080
00081 inline friend DifComplex operator+(const DifComplex& a,const DifComplex& b);
00082 inline friend DifComplex operator-(const DifComplex& a,const DifComplex& b);
00083 inline friend DifComplex operator*(const DifComplex& a,const DifComplex& b);
00084 inline friend DifComplex operator/(const DifComplex& a,const DifComplex& b);
00085 inline friend bool operator==(const DifComplex& a,const DifComplex& b);
00086 inline friend bool operator!=(const DifComplex& a,const DifComplex& b);
00087 inline friend DifComplex sin(const DifComplex& a);
00088 inline friend DifComplex cos(const DifComplex& a);
00089 inline friend DifComplex tan(const DifComplex &a);
00090 inline friend DifComplex sec(const DifComplex &a);
00091 inline friend DifComplex asin(const DifComplex &a);
00092 inline friend DifComplex acos(const DifComplex &a);
00093 inline friend DifComplex atan(const DifComplex &a);
00094 inline friend DifComplex atan2(const DifComplex& a,const DifComplex& b);
00095 inline friend DifComplex exp(const DifComplex& a);
00096 inline friend DifComplex cosh(const DifComplex& a);
00097 inline friend DifComplex sinh(const DifComplex& a);
00098 inline friend DifComplex tanh(const DifComplex& a);
00099 inline friend DifComplex sqrt(const DifComplex& a);
00100 inline friend DifComplex log(const DifComplex& a);
00101 inline friend DifComplex pow(const DifComplex& a,const DifComplex& p);
00102 inline friend DifComplex pow(const DifComplex& a,const DifNumber& p);
00103 inline friend DifComplex cc(const DifComplex& a);
00104 inline friend DifComplex fromPolar
00105 (const DifNumber& mag,const DifNumber& phase);
00106
00107
00108
00109
00110 inline virtual ~DifComplex(){};
00111
00112 private:
00113
00114
00115 DifNumber _r;
00116 DifNumber _i;
00117
00118
00119 inline DifNumber& gimeR() {return _r;}
00120 inline DifNumber& gimeI() {return _i;}
00121 inline const DifNumber& R()const {return _r;}
00122 inline const DifNumber& I()const {return _i;}
00123 };
00124
00125 #include "MdcRecoUtil/DifComplex.icc"
00126
00127
00128
00129
00130
00131
00132 #endif
00133
00134
00135
00136
00137