www.pudn.com > Tierazon-v29.zip > cmplx.h


// cmplx.h 
#include "math.h" 
 
#define maxterm 100 
#define abstol 1.e-10 
#define reltol 1.e-5 
#define zerotol 1.e-50    // 1.e-14 
#define errorcode -1.e60 
#define pi 3.141592653589793238462643383279 
#define rad 57.2958 
#define lim 15. 
// #define max(a,b) ((a)>(b)?(a):(b)) 
#define infinite_loop for(;;) 
#define rabs(x) ((x)<0.? -(x):(x)) 
#define ABS(X) rabs(X) 
#define topexp 350. 
#define expo 2.7183 
 
class cmplx 
{ 
// Attributes 
public:  
  double x,y; 
	double bio; 
 
	// Operations 
public:  
  cmplx( double xx , double yy); //create 
  cmplx(); //create 
 
  inline void operator=(cmplx rvalue) 
         {x=rvalue.x;y=rvalue.y;} 
  inline void operator-=(cmplx rvalue) 
         {x-=rvalue.x;y-=rvalue.y;} 
  inline void operator+=(cmplx rvalue) 
         {x+=rvalue.x;y+=rvalue.y;} 
  inline void operator*=(cmplx rvalue) 
         { 
          *this=cmplx(rvalue.x*x-rvalue.y*y,  
            rvalue.x*y+rvalue.y*x); 
         } 
  inline void operator*=(double rvalue) 
         { 
         *this=cmplx(rvalue*x, rvalue*y);//return *this; 
         } 
  inline cmplx& operator+(cmplx& rvalue) 
         {return cmplx(x+rvalue.x,y+rvalue.y);} 
  inline cmplx& operator-(cmplx& rvalue) 
         {return cmplx(x-rvalue.x,y-rvalue.y);} 
  inline cmplx& operator-() //unary minus 
         {return cmplx(-x,-y);} 
  inline cmplx& operator*(cmplx rvalue) 
         {return cmplx( 
          rvalue.x*x-rvalue.y*y, 
          rvalue.x*y+rvalue.y*x);} 
  inline friend cmplx operator/(double dividend,cmplx divisor) 
         {  
          return cmplx((dividend*divisor.x)/(divisor.x*divisor.x+divisor.y*divisor.y), 
           (-dividend*divisor.y)/(divisor.x*divisor.x+divisor.y*divisor.y)); 
         } 
  inline cmplx operator/(cmplx divisor) 
				{  
         return cmplx((divisor.x*x+divisor.y*y)/(divisor.x*divisor.x+divisor.y*divisor.y), 
            (divisor.x*y-divisor.y*x)/(divisor.x*divisor.x+divisor.y*divisor.y)); 
         } 
 
  inline int operator==(cmplx rvalue) 
         {return (x==rvalue.x && y==rvalue.y);} 
 
  inline cmplx operator^(double expon) 
			{ 
				return ((*this).clog( ) * expon).cexp();			 
			} 
			 
  inline cmplx operator^(cmplx expon) 
			{ 
				return ((*this).clog( ) * expon).cexp(); 
			} 
 
  friend cmplx operator^(double base, cmplx expon);       
 
			inline double real() {return x;} 
      inline double imaginary() {return y;} 
      inline double imag() {return y;} 
			inline double abs() {return (x*x+y*y);} 
			inline double magnitude1() {return sqrt(x*x+y*y);} 
 
			inline cmplx Real() { 
				return cmplx (x, 0); } 
 
			inline cmplx Imag() { 
				return cmplx (y, 0); } 
 
			inline cmplx cexp() { 
				return cmplx(exp(x)*cos(y),exp(x)*sin(y));} 
 
			inline cmplx clog() { 
				return cmplx(log(fabs((*this).magnitude1())),atan2(y,x));} 
 
			inline cmplx unknown() { // suppose to be sine 
				return cmplx(.5*(exp(y)+1./exp(y))*sin(x),cos(x)*.5*(exp(y)-1./exp(y)));} 
       
			inline cmplx conjugate() 
         {return cmplx(x,-y);} 
      inline friend cmplx operator*(cmplx& num,double real) 
         {return cmplx(num.x*real,num.y*real);} 
      inline friend cmplx operator*(double real,cmplx num) 
         {return cmplx(num.x*real,num.y*real);} 
      inline friend cmplx operator+(cmplx num,double real) 
         {return cmplx(num.x+real,num.y);} 
      inline friend cmplx operator+(double real,cmplx num) 
         {return cmplx(num.x+real,num.y);} 
      inline cmplx operator+=(double real) 
         {return cmplx(x+=real,y);} 
      inline cmplx operator-=(double real) 
         { 
         return cmplx(x-=real,y);} 
      inline cmplx operator++() 
         {x+=1.;return *this;} 
      inline friend cmplx operator/(cmplx num,double real) 
         {return cmplx(num.x/real,num.y/real);} 
      inline friend cmplx operator-(cmplx num,double real) 
         {return cmplx(num.x-real,num.y);} 
      inline friend cmplx operator-(double real,cmplx num) 
         {return cmplx(real-num.x,-num.y);} 
			 
			void set_biomorph(double dBiomorph); 
			void set_real(double set_x); 
			void set_imag(double set_y); 
 
      double squares(); 
      double magnitude(); 
      double biotest(); 
 
		  cmplx csin(); 
			cmplx csin_error(); // used for alden's ray method 
		  cmplx ccos(); 
		  cmplx csqrt(); 
 
      //void print( char *ahead="",char *behind=""); 
      cmplx hurwitz(cmplx ); 
 
}; 
 
#define _cmplx_DEFINED 
 
//double cmplx::abs(); 
//double cmplx::sum_of_sqrs(); 
//cmplx cmplx::cexp(); 
//cmplx cmplx::clog(); 
//double cmplx::squares(); 
 
//cmplx cmplx::operator^(double expon); 
//cmplx cmplx::operator^(cmplx expon); 
 
cmplx cmplx::csin(); 
cmplx cmplx::ccos(); 
cmplx cmplx::csin_error(); 
 
cmplx tangent ( cmplx& x); 
cmplx sinh(cmplx& x); 
cmplx asin(cmplx&x); 
cmplx acos(cmplx&x); 
cmplx arctan( cmplx& x); 
cmplx cpow( cmplx& x, int nPower); 
cmplx cpow( cmplx& x, cmplx& nPower); 
double loggam(double x); 
double gamma(double x); 
double bernoulli(int n);   /* n even 0<=n*/ 
double expon(double x);