home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / modhead1.zip / COMPLEX.H < prev    next >
C/C++ Source or Header  |  1995-09-17  |  6KB  |  228 lines

  1.  
  2. /*
  3.  *   complex.h
  4.  *
  5.  *   C++ Complex mathematics.
  6.  *
  7.  *           Copyright (c) 1991-1992, MetaWare Incorporated
  8.  */
  9.  
  10. #ifndef __COMPLEX_H
  11. #define __COMPLEX_H
  12. #pragma push_align_members(64);
  13.  
  14. #include <math.h>
  15.  
  16. #if _MSDOS && !__EXCEPTIONS__
  17.     #pragma off(exception_aware_class);
  18. #elif _MSDOS || _MSNT || _OS2
  19.     #pragma on(exception_aware_class);
  20. #endif
  21.  
  22. #if _MSNT && _DLL && !_DLLBUILD
  23.     #pragma on(dllimport);
  24. #endif
  25.  
  26.  
  27. #pragma on(nodebug)
  28. class complex {
  29.  
  30. private:
  31.     double _real;
  32.     double _imaginary;
  33.  
  34.  
  35. public:
  36.  
  37.     complex(double __real_part, double __imag_part=0) {
  38.         _real=__real_part;
  39.         _imaginary=__imag_part;
  40.         }
  41.     complex() {
  42.         _real = _imaginary = 0.0;
  43.         }
  44.  
  45.     // complex manipulations
  46.     friend double real(complex&);    // Inspect real part
  47.     friend double imag(complex&);    // Inspect imaginary part
  48.     friend complex conj(complex&);    // Complex conjugate
  49.     friend double norm(complex&);    // Magnitude^2
  50.     friend double arg(complex&);    // Angle in the plane
  51.  
  52.     // Create a complex from polar coordinates
  53.     friend complex polar(double __mag, double __angle=0);
  54.  
  55.     // ANSI C math functions for complex numbers.
  56.     friend complex pow(complex& __base, double __expon);
  57.     friend complex pow(double __base, complex& __expon);
  58.     friend complex pow(complex& __base, complex& __expon);
  59.  
  60.     friend complex cos(complex&);
  61.     friend complex cosh(complex&);
  62.  
  63.     friend complex sin(complex&);
  64.     friend complex sinh(complex&);
  65.  
  66.     friend complex tan(complex&);
  67.     friend complex tanh(complex&);
  68.  
  69.     friend complex acos(complex&);
  70.     friend complex asin(complex&);
  71.     friend complex atan(complex&);
  72.  
  73.     friend double  abs(complex&);
  74.     friend complex exp(complex&);
  75.     friend complex sqrt(complex&);
  76.  
  77.     friend complex log(complex&);
  78.     friend complex log10(complex&);
  79.  
  80.     // Binary operators
  81.     friend complex operator*(complex&, complex&);
  82.     friend complex operator*(complex&, double);
  83.     friend complex operator*(double, complex&);
  84.  
  85.     friend complex operator/(complex&, complex&);
  86.     friend complex operator/(complex&, double);
  87.     friend complex operator/(double, complex&);
  88.  
  89.     friend complex operator+(complex&, complex&);
  90.     friend complex operator+(double, complex&);
  91.     friend complex operator+(complex&, double);
  92.  
  93.     friend complex operator-(complex&, complex&);
  94.     friend complex operator-(double, complex&);
  95.     friend complex operator-(complex&, double);
  96.  
  97.     friend int operator==(complex&, complex&);
  98.     friend int operator!=(complex&, complex&);
  99.  
  100.     // Compound assignment
  101.     complex& operator*=(complex& __z);
  102.     complex& operator*=(double __d) {
  103.         _real *= __d;
  104.         _imaginary *= __d;
  105.         return *this;
  106.         }
  107.  
  108.     complex& operator/=(complex& __z);
  109.     complex& operator/=(double __d) {
  110.         _real /= __d;
  111.         _imaginary /= __d;
  112.         return *this;
  113.         }
  114.  
  115.     complex& operator+=(complex& __z) {
  116.         _real += __z._real;
  117.         _imaginary += __z._imaginary;
  118.         return *this;
  119.         }
  120.     complex& operator+=(double __d) {
  121.         _real+= __d;
  122.         return *this;
  123.         }
  124.  
  125.     complex& operator-=(complex& __z) {
  126.         _real -= __z._real;
  127.         _imaginary -= __z._imaginary;
  128.         return *this;
  129.         }
  130.     complex& operator-=(double __d) {
  131.         _real -= __d;
  132.         return *this;
  133.         }
  134.  
  135.     // Unary operators
  136.     complex operator+() { return *this; }
  137.     complex operator-() { return (complex(-_real,-_imaginary)); }
  138.     };
  139. #pragma pop(nodebug)
  140.  
  141.  
  142. inline double real(complex& __z) {
  143.     return __z._real;
  144.     }
  145.  
  146. inline double imag(complex& __z) {
  147.     return __z._imaginary;
  148.     }
  149.  
  150. inline complex conj(complex& __z) {
  151.     return complex(__z._real, -__z._imaginary);
  152.     }
  153.  
  154. inline complex polar(double __mag, double __angle) {
  155.     return complex(__mag*cos(__angle), __mag*sin(__angle));
  156.     }
  157.  
  158. inline double abs(complex& __z) {
  159.         return sqrt((__z._real * __z._real)+(__z._imaginary * __z._imaginary));
  160.     }
  161.  
  162.  
  163. inline complex operator*(complex& __z, double __d) {
  164.     return complex(__z._real * __d, __z._imaginary * __d);
  165.     }
  166.  
  167. inline complex operator*(double __d, complex& __z) {
  168.     return complex(__z._real * __d, __z._imaginary * __d);
  169.     }
  170.  
  171. inline complex operator/(complex& __z, double __d) {
  172.     return complex(__z._real / __d, __z._imaginary / __d);
  173.     }
  174.  
  175. inline complex operator+(complex& __za, complex& __zb) {
  176.     return complex(__za._real+__zb._real, __za._imaginary+__zb._imaginary);
  177.     }
  178.  
  179. inline complex operator+(double __d, complex& __z) {
  180.     return complex(__d + __z._real, __z._imaginary);
  181.     }
  182.  
  183. inline complex operator+(complex& __z, double __d) {
  184.     return complex(__z._real + __d, __z._imaginary);
  185.     }
  186.  
  187. inline complex operator-(complex& __za, complex& __zb) {
  188.     return complex(__za._real-__zb._real, __za._imaginary-__zb._imaginary);
  189.     }
  190.  
  191. inline complex operator-(double __d, complex& __z) {
  192.     return complex(__d - __z._real, -__z._imaginary);
  193.     }
  194.  
  195. inline complex operator-(complex& __z, double __d) {
  196.     return complex(__z._real - __d, __z._imaginary);
  197.     }
  198.  
  199. inline int operator==(complex& __za, complex& __zb) {
  200.     return    (  (__za._real == __zb._real)
  201.         && (__za._imaginary == __zb._imaginary)
  202.         );
  203.     }
  204.  
  205. inline int operator!=(complex& __za, complex& __zb) {
  206.     return    (  (__za._real != __zb._real)
  207.         || (__za._imaginary != __zb._imaginary)
  208.         );
  209.     }
  210.  
  211. #c_include <iostream.h>
  212.  
  213. ostream& operator<<(ostream& __os, complex& __z);
  214. istream& operator>>(istream& __is, complex& __z);
  215.  
  216. #if _MSNT && _DLL && !_DLLBUILD
  217.     #pragma pop(dllimport);
  218. #endif
  219.  
  220. #if _MSDOS || _MSNT || _OS2
  221.     #pragma pop(exception_aware_class);
  222. #endif
  223.  
  224. #pragma pop_align_members();
  225. #endif  // __COMPLEX_H
  226.  
  227. /**          Copyright (c) 1991-1992, MetaWare Incorporated             **/
  228.