home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume10 / complex-lib / cxdiv.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-07-14  |  820 b   |  43 lines

  1. /*
  2.     CxDiv -- divide one complex by another
  3.  
  4.     CxDiv( &a, &b )    divides  a  by  b  and returns  &a;
  5.             zero divisor fails
  6.  
  7.     last edit:    86/01/04    D A Gwyn
  8.  
  9.     SCCS ID:    @(#)cxdiv.c    1.1 (modified for public version)
  10. */
  11.  
  12. #include    <complex.h>
  13.  
  14. #define Abs( x )    ((x) < 0 ? -(x) : (x))
  15.  
  16. complex *
  17. CxDiv( ap, bp )
  18.     register complex    *ap, *bp;    /* may coincide (?) */
  19.     {
  20.     double    r, s;
  21.     double    ap__re = ap->re;
  22.  
  23.     /* Note: classical formula may cause unnecessary overflow */
  24.     r = bp->re;
  25.     s = bp->im;
  26.     if ( Abs( r ) >= Abs( s ) )
  27.         {
  28.         r = s / r;        /* <= 1 */
  29.         s = bp->re + r * s;
  30.         ap->re = (ap->re + ap->im * r) / s;
  31.         ap->im = (ap->im - ap__re * r) / s;
  32.         }
  33.     else /* Abs( s ) > Abs( r ) */
  34.         {
  35.         r = r / s;        /* < 1 */
  36.         s = s + r * bp->re;
  37.         ap->re = (ap->re * r + ap->im) / s;
  38.         ap->im = (ap->im * r - ap__re) / s;
  39.         }
  40.  
  41.     return ap;
  42.     }
  43.