pow_qq.c 516 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. #include "f2c.h"
  2. #ifdef __cplusplus
  3. extern "C" {
  4. #endif
  5. #ifdef KR_headers
  6. longint pow_qq(ap, bp) longint *ap, *bp;
  7. #else
  8. longint pow_qq(longint *ap, longint *bp)
  9. #endif
  10. {
  11. longint pow, x, n;
  12. unsigned long long u; /* system-dependent */
  13. x = *ap;
  14. n = *bp;
  15. if (n <= 0) {
  16. if (n == 0 || x == 1)
  17. return 1;
  18. if (x != -1)
  19. return x == 0 ? 1/x : 0;
  20. n = -n;
  21. }
  22. u = n;
  23. for(pow = 1; ; )
  24. {
  25. if(u & 01)
  26. pow *= x;
  27. if(u >>= 1)
  28. x *= x;
  29. else
  30. break;
  31. }
  32. return(pow);
  33. }
  34. #ifdef __cplusplus
  35. }
  36. #endif