home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / C / SASC6571.LZX / cxxinclude / complex.h next >
Encoding:
C/C++ Source or Header  |  1996-12-24  |  3.1 KB  |  91 lines

  1. /* Copyright (c) 1993             by SAS Institute Inc., Cary NC     */
  2.  
  3. #ifndef __COMPLEX_H
  4. #define __COMPLEX_H
  5.  
  6.  
  7. #ifndef _MATH_H
  8. #include <math.h>
  9. #endif
  10.  
  11. #ifndef __IOSTREAM_H
  12. #include <iostream.h>
  13. #endif
  14.  
  15. class complex {
  16. public:
  17.    // constructors
  18.    complex(){}
  19.    complex(double r, double i = 0.0)  _INLINE_FUNC({ re = r; im = i; })
  20.  
  21.    // complex operators
  22.    friend complex operator+ (complex a, complex b)
  23.               _INLINE_FUNC({return complex(a.re+b.re,a.im+b.im);})
  24.    friend complex operator- (complex a)
  25.               _INLINE_FUNC({return complex(-a.re,-a.im);})
  26.    friend complex operator- (complex a, complex b)
  27.               _INLINE_FUNC({return complex(a.re-b.re,a.im-b.im);})
  28.    friend complex operator* (complex a, complex b)
  29.               _INLINE_FUNC({return complex(a.re*b.re-a.im*b.im,
  30.                                             a.re*b.im+a.im*b.re);})
  31.    friend complex operator/ (complex a, complex b);
  32.    friend complex operator/ (complex a, double d)
  33.               _INLINE_FUNC({return complex(a.re/d,a.im/d);})
  34.  
  35.    friend int     operator==(complex a, complex b)
  36.               _INLINE_FUNC({return a.re==b.re && a.im==b.im;})
  37.    friend int     operator!=(complex a, complex b)
  38.               _INLINE_FUNC({return a.re!=b.re || a.im!=b.im;})
  39.  
  40.    void    operator+=(complex a) _INLINE_FUNC({re += a.re; im += a.im;})
  41.    void    operator-=(complex a) _INLINE_FUNC({re -= a.re; im -= a.im;})
  42.    void    operator*=(complex a)
  43.               _INLINE_FUNC({double re_temp;
  44.                             re_temp = re*a.re - im*a.im;
  45.                             im = re*a.im + im*a.re;
  46.                             re = re_temp;})
  47.    void    operator/=(complex a) _INLINE_FUNC({(*this) = (*this) / a;})
  48.    void    operator/=(double d) _INLINE_FUNC({re /= d; im /= d;})
  49.  
  50.    // cartesian and polar coordinate functions
  51.    friend double  abs   (complex a);
  52.    friend double  arg   (complex a) _INLINE_FUNC({return atan2(a.im,a.re);})
  53.    friend complex conj  (complex a) _INLINE_FUNC({return complex(a.re,-a.im);})
  54.    friend double  imag  (complex a) _INLINE_FUNC({return a.im;})
  55.    friend double  norm  (complex a) _INLINE_FUNC({return a.re*a.re+a.im*a.im;})
  56.    friend complex polar (double r, double t = 0.0)
  57.              _INLINE_FUNC({return complex(r*cos(t),r*sin(t));})
  58.    friend double  real  (complex a) _INLINE_FUNC({return a.re;})
  59.  
  60.    // exponential, logarithmic, power, and square root functions
  61.    friend complex exp  (complex a);
  62.    friend complex log  (complex a);
  63.    friend complex pow  (double d, complex a);
  64.    friend complex pow  (complex a, int i);
  65.    friend complex pow  (complex a, double d);
  66.    friend complex pow  (complex x, complex y);
  67.    friend complex sqrt (complex a);
  68.  
  69.    // trignometric and hyperbolic functions
  70.    friend complex sin  (complex a);
  71.    friend complex cos  (complex a);
  72.    friend complex sinh (complex a);
  73.    friend complex cosh (complex a);
  74.  
  75. private:
  76.    double re, im;
  77.    int unbalanced();
  78.    complex sinhcosh(int sincos);
  79.    complex powzero();
  80. };
  81.  
  82. // I/O functions 
  83. ostream& operator<<(ostream&, complex);
  84. istream& operator>>(istream&, complex&);
  85.  
  86.  
  87. #endif /* __COMPLEX_H */
  88.  
  89.  
  90.  
  91.