summaryrefslogtreecommitdiff
path: root/gnu/lib/libf2c/libF77/pow_qq.c
blob: 0cec5ca7d8cb652d4cd3cba1577ee0b44e902b58 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include "f2c.h"

longint
pow_qq (longint * ap, longint * bp)
{
  longint pow, x, n;
  unsigned long long u;		/* system-dependent */

  x = *ap;
  n = *bp;

  if (n <= 0)
    {
      if (n == 0 || x == 1)
	return 1;
      if (x != -1)
	return x == 0 ? 1 / x : 0;
      n = -n;
    }
  u = n;
  for (pow = 1;;)
    {
      if (u & 01)
	pow *= x;
      if (u >>= 1)
	x *= x;
      else
	break;
    }
  return (pow);
}