home *** CD-ROM | disk | FTP | other *** search
/ Piper's Pit BBS/FTP: ibm 0040 - 0049 / ibm0040-0049 / ibm0040.tar / ibm0040 / BCPPOWL3.ZIP / PATINC.ZIP / COMPLEX.H < prev    next >
Encoding:
C/C++ Source or Header  |  1991-08-28  |  7.6 KB  |  265 lines

  1. /* complex.h
  2.  
  3.     Complex Number Library - Include File
  4.     class complex:  declarations for complex numbers.
  5.  
  6.     Copyright (c) Borland International 1990,1991
  7.     All Rights Reserved.
  8.  
  9. All function names, member names, and operators have been borrowed
  10. from AT&T C++, except for the addition of:
  11.  
  12.     friend complex _Cdecl acos(complex _FAR &);
  13.     friend complex _Cdecl asin(complex _FAR &);
  14.     friend complex _Cdecl atan(complex _FAR &);
  15.     friend complex _Cdecl log10(complex _FAR &);
  16.     friend complex _Cdecl tan(complex _FAR &);
  17.     friend complex _Cdecl tanh(complex _FAR &);
  18.     complex _Cdecl operator+();
  19.     complex _Cdecl operator-();
  20. */
  21.  
  22. #ifndef __cplusplus
  23. #error Must use C++ for the type complex.
  24. #endif
  25.  
  26. #if !defined( __DEFS_H )
  27. #include <_defs.h>
  28. #endif
  29.  
  30. #if !defined( __COMPLEX_H )
  31. #define _COMPLEX_H
  32.  
  33. #if !defined( __MATH_H )
  34. #include <math.h>
  35. #endif
  36.  
  37. _CLASSDEF(complex)
  38.  
  39. class _CLASSTYPE complex {
  40.  
  41. public:
  42.     // constructors
  43.     complex(double __re_val, double __im_val=0);
  44.     complex();
  45.  
  46.     // complex manipulations
  47.     friend double _Cdecl _FARFUNC real(complex _FAR &);   // the real part
  48.     friend double _Cdecl _FARFUNC imag(complex _FAR &);   // the imaginary part
  49.     friend complex _Cdecl _FARFUNC conj(complex _FAR &);  // the complex conjugate
  50.     friend double _Cdecl _FARFUNC norm(complex _FAR &);   // the square of the magnitude
  51.     friend double _Cdecl _FARFUNC arg(complex _FAR &);    // the angle in the plane
  52.  
  53.     // Create a complex object given polar coordinates
  54.     friend complex _Cdecl polar(double __mag, double __angle=0);
  55.  
  56.     // Overloaded ANSI C math functions
  57.     friend double  _Cdecl _FARFUNC abs(complex _FAR &);
  58.     friend complex _Cdecl _FARFUNC acos(complex _FAR &);
  59.     friend complex _Cdecl _FARFUNC asin(complex _FAR &);
  60.     friend complex _Cdecl _FARFUNC atan(complex _FAR &);
  61.     friend complex _Cdecl _FARFUNC cos(complex _FAR &);
  62.     friend complex _Cdecl _FARFUNC cosh(complex _FAR &);
  63.     friend complex _Cdecl _FARFUNC exp(complex _FAR &);
  64.     friend complex _Cdecl _FARFUNC log(complex _FAR &);
  65.     friend complex _Cdecl _FARFUNC log10(complex _FAR &);
  66.     friend complex _Cdecl _FARFUNC pow(complex _FAR & __base, double __expon);
  67.     friend complex _Cdecl _FARFUNC pow(double __base, complex _FAR & __expon);
  68.     friend complex _Cdecl _FARFUNC pow(complex _FAR & __base, complex _FAR & __expon);
  69.     friend complex _Cdecl _FARFUNC sin(complex _FAR &);
  70.     friend complex _Cdecl _FARFUNC sinh(complex _FAR &);
  71.     friend complex _Cdecl _FARFUNC sqrt(complex _FAR &);
  72.     friend complex _Cdecl _FARFUNC tan(complex _FAR &);
  73.     friend complex _Cdecl _FARFUNC tanh(complex _FAR &);
  74.  
  75.     // Binary Operator Functions
  76.     friend complex _Cdecl _FARFUNC operator+(complex _FAR &, complex _FAR &);
  77.     friend complex _Cdecl _FARFUNC operator+(double, complex _FAR &);
  78.     friend complex _Cdecl _FARFUNC operator+(complex _FAR &, double);
  79.     friend complex _Cdecl _FARFUNC operator-(complex _FAR &, complex _FAR &);
  80.     friend complex _Cdecl _FARFUNC operator-(double, complex _FAR &);
  81.     friend complex _Cdecl _FARFUNC operator-(complex _FAR &, double);
  82.     friend complex _Cdecl _FARFUNC operator*(complex _FAR &, complex _FAR &);
  83.     friend complex _Cdecl _FARFUNC operator*(complex _FAR &, double);
  84.     friend complex _Cdecl _FARFUNC operator*(double, complex _FAR &);
  85.     friend complex _Cdecl _FARFUNC operator/(complex _FAR &, complex _FAR &);
  86.     friend complex _Cdecl _FARFUNC operator/(complex _FAR &, double);
  87.     friend complex _Cdecl _FARFUNC operator/(double, complex _FAR &);
  88.     friend int _Cdecl _FARFUNC operator==(complex _FAR &, complex _FAR &);
  89.     friend int _Cdecl _FARFUNC operator!=(complex _FAR &, complex _FAR &);
  90.     complex _FAR & _Cdecl operator+=(complex _FAR &);
  91.     complex _FAR & _Cdecl operator+=(double);
  92.     complex _FAR & _Cdecl operator-=(complex _FAR &);
  93.     complex _FAR & _Cdecl operator-=(double);
  94.     complex _FAR & _Cdecl operator*=(complex _FAR &);
  95.     complex _FAR & _Cdecl operator*=(double);
  96.     complex _FAR & _Cdecl operator/=(complex _FAR &);
  97.     complex _FAR & _Cdecl operator/=(double);
  98.     complex _Cdecl operator+();
  99.     complex _Cdecl operator-();
  100.  
  101. // Implementation
  102. private:
  103.         double re, im;
  104. };
  105.  
  106.  
  107. // Inline complex functions
  108.  
  109. inline complex::complex(double __re_val, double __im_val)
  110. {
  111.     re = __re_val;
  112.     im = __im_val;
  113. }
  114.  
  115. inline complex::complex()
  116. {
  117. /* if you want your complex numbers initialized ...
  118.     re = im = 0;
  119. */
  120. }
  121.  
  122. inline complex _Cdecl complex::operator+()
  123. {
  124.     return *this;
  125. }
  126.  
  127. inline complex _Cdecl complex::operator-()
  128. {
  129.     return complex(-re, -im);
  130. }
  131.  
  132.  
  133. // Definitions of compound-assignment operator member functions
  134.  
  135. inline complex _FAR & _Cdecl complex::operator+=(complex _FAR & __z2)
  136. {
  137.     re += __z2.re;
  138.     im += __z2.im;
  139.     return *this;
  140. }
  141.  
  142. inline complex _FAR & _Cdecl complex::operator+=(double __re_val2)
  143. {
  144.     re += __re_val2;
  145.     return *this;
  146. }
  147.  
  148. inline complex _FAR & _Cdecl complex::operator-=(complex _FAR & __z2)
  149. {
  150.     re -= __z2.re;
  151.     im -= __z2.im;
  152.     return *this;
  153. }
  154.  
  155. inline complex _FAR & _Cdecl complex::operator-=(double __re_val2)
  156. {
  157.     re -= __re_val2;
  158.     return *this;
  159. }
  160.  
  161. inline complex _FAR & _Cdecl complex::operator*=(double __re_val2)
  162. {
  163.     re *= __re_val2;
  164.     im *= __re_val2;
  165.     return *this;
  166. }
  167.  
  168. inline complex _FAR & _Cdecl complex::operator/=(double __re_val2)
  169. {
  170.     re /= __re_val2;
  171.     im /= __re_val2;
  172.     return *this;
  173. }
  174.  
  175.  
  176. // Definitions of non-member complex functions
  177.  
  178. inline double _Cdecl real(complex _FAR & __z)
  179. {
  180.     return __z.re;
  181. }
  182.  
  183. inline double _Cdecl imag(complex _FAR & __z)
  184. {
  185.     return __z.im;
  186. }
  187.  
  188. inline complex _Cdecl conj(complex _FAR & __z)
  189. {
  190.     return complex(__z.re, -__z.im);
  191. }
  192.  
  193. inline complex _Cdecl polar(double __mag, double __angle)
  194. {
  195.     return complex(__mag*cos(__angle), __mag*sin(__angle));
  196. }
  197.  
  198.  
  199. // Definitions of non-member binary operator functions
  200.  
  201. inline complex _Cdecl operator+(complex _FAR & __z1, complex _FAR & __z2)
  202. {
  203.     return complex(__z1.re + __z2.re, __z1.im + __z2.im);
  204. }
  205.  
  206. inline complex _Cdecl operator+(double __re_val1, complex _FAR & __z2)
  207. {
  208.     return complex(__re_val1 + __z2.re, __z2.im);
  209. }
  210.  
  211. inline complex _Cdecl operator+(complex _FAR & __z1, double __re_val2)
  212. {
  213.     return complex(__z1.re + __re_val2, __z1.im);
  214. }
  215.  
  216. inline complex _Cdecl operator-(complex _FAR & __z1, complex _FAR & __z2)
  217. {
  218.     return complex(__z1.re - __z2.re, __z1.im - __z2.im);
  219. }
  220.  
  221. inline complex _Cdecl operator-(double __re_val1, complex _FAR & __z2)
  222. {
  223.     return complex(__re_val1 - __z2.re, -__z2.im);
  224. }
  225.  
  226. inline complex _Cdecl operator-(complex _FAR & __z1, double __re_val2)
  227. {
  228.     return complex(__z1.re - __re_val2, __z1.im);
  229. }
  230.  
  231. inline complex _Cdecl operator*(complex _FAR & __z1, double __re_val2)
  232. {
  233.     return complex(__z1.re*__re_val2, __z1.im*__re_val2);
  234. }
  235.  
  236. inline complex _Cdecl operator*(double __re_val1, complex _FAR & __z2)
  237. {
  238.     return complex(__z2.re*__re_val1, __z2.im*__re_val1);
  239. }
  240.  
  241. inline complex _Cdecl operator/(complex _FAR & __z1, double __re_val2)
  242. {
  243.     return complex(__z1.re/__re_val2, __z1.im/__re_val2);
  244. }
  245.  
  246. inline int _Cdecl operator==(complex _FAR & __z1, complex _FAR & __z2)
  247. {
  248.     return __z1.re == __z2.re && __z1.im == __z2.im;
  249. }
  250.  
  251. inline int _Cdecl operator!=(complex _FAR & __z1, complex _FAR & __z2)
  252. {
  253.     return __z1.re != __z2.re || __z1.im != __z2.im;
  254. }
  255.  
  256.  
  257. // Complex stream I/O
  258.  
  259. #include <iostream.h>
  260.  
  261. ostream _FAR & _Cdecl _FARFUNC operator<<(ostream _FAR &, complex _FAR &);
  262. istream _FAR & _Cdecl _FARFUNC operator>>(istream _FAR &, complex _FAR &);
  263.  
  264. #endif  // __COMPLEX_H
  265.