home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c221 / 7.ddi / MWHC.007 / G < prev    next >
Encoding:
Text File  |  1992-08-26  |  5.1 KB  |  214 lines

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