home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / g77-0.5.15-src.tgz / tar.out / fsf / g77 / f / runtime / libF77 / pow_zi.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  715b  |  52 lines

  1. #include "f2c.h"
  2.  
  3. #ifdef KR_headers
  4. VOID pow_zi(p, a, b)     /* p = a**b  */
  5.  doublecomplex *p, *a; integer *b;
  6. #else
  7. extern void z_div(doublecomplex*, doublecomplex*, doublecomplex*);
  8. void pow_zi(doublecomplex *p, doublecomplex *a, integer *b)     /* p = a**b  */
  9. #endif
  10. {
  11. integer n;
  12. unsigned long u;
  13. double t;
  14. doublecomplex x;
  15. static doublecomplex one = {1.0, 0.0};
  16.  
  17. n = *b;
  18. p->r = 1;
  19. p->i = 0;
  20.  
  21. if(n == 0)
  22.     return;
  23. if(n < 0)
  24.     {
  25.     n = -n;
  26.     z_div(&x, &one, a);
  27.     }
  28. else
  29.     {
  30.     x.r = a->r;
  31.     x.i = a->i;
  32.     }
  33.  
  34. for(u = n; ; )
  35.     {
  36.     if(u & 01)
  37.         {
  38.         t = p->r * x.r - p->i * x.i;
  39.         p->i = p->r * x.i + p->i * x.r;
  40.         p->r = t;
  41.         }
  42.     if(u >>= 1)
  43.         {
  44.         t = x.r * x.r - x.i * x.i;
  45.         x.i = 2 * x.r * x.i;
  46.         x.r = t;
  47.         }
  48.     else
  49.         break;
  50.     }
  51. }
  52.