/************************************************************************** * complex * * template version of complex **************************************************************************/ #ifndef G__COMPLEX #define G__COMPLEX #include #include template class complex { public: complex(scalar a=0,scalar b=0) { re=a; im=b; } complex(const complex& a) {re=a.re; im=a.im;} complex& operator=(const complex& a) { this->re=a.re; this->im=a.im; return(*this); } scalar real() { return re; } scalar imag() { return im; } protected: scalar re,im; public: friend complex operator +(complex& a,complex& b); friend complex operator -(complex& a,complex& b); friend complex operator *(complex& a,complex& b); friend complex operator /(complex& a,complex& b); #ifndef __MAKECINT__ friend complex exp(const complex& a); #endif friend scalar abs(const complex& a); }; template complex operator +(complex& a,complex& b) { complex c; c.re = a.re+b.re; c.im = a.im+b.im; return(c); } template complex operator -(complex& a,complex& b) { complex c; c.re = a.re-b.re; c.im = a.im-b.im; return(c); } template complex operator *(complex& a,complex& b) { complex c; c.re = a.re*b.re-a.im*b.im; c.im = a.re*b.im+a.im*b.re; return(c); } template complex operator /(complex& a,complex& b) { complex c; scalar x; x = b.re*b.re+b.im*b.im; c.re = (a.re*b.re+a.im*b.im)/x; c.im = (a.im*b.re-a.re*b.im)/x; return(c); } //********************************************************************** #ifndef __MAKECINT__ template complex exp(const complex& a) { complex c; scalar mag; mag = exp(a.real()); c.re=mag*cos(a.im); c.im=mag*sin(a.im); return(c); } #endif template scalar abs(const complex& a) { scalar result; result = sqrt(a.re*a.re+a.im*a.im); return(result); } /************************************************************************** * iostream **************************************************************************/ template ostream& operator <<(ostream& ios,complex& a) { ios << "(" << a.real() << "," << a.imag() << ")" ; return(ios); } template ostrstream& operator <<(ostrstream& ios,complex& a) { ios << "(" << a.real() << "," << a.imag() << ")" ; return(ios); } template istream& operator >>(istream& ios,complex& a) { ios >> a.real() >> a.imag() ; return(ios); } template istrstream& operator >>(istrstream& ios,complex& a) { ios >> a.real() >> b.imag() ; return(ios); } #endif