xref: /csrg-svn/usr.bin/f77/libF77/pow_ii.c (revision 11912)
110514Sdlw /*
2*11912Sdlw  *	"@(#)pow_ii.c	1.2"
3*11912Sdlw  *
4*11912Sdlw  *  Corrections by Robert P. Corbett, 1983 March 2
5*11912Sdlw  *  Revised to restore portability, 1983 March 4
610514Sdlw  */
710514Sdlw 
8*11912Sdlw 
910514Sdlw long int pow_ii(ap, bp)
1010514Sdlw long int *ap, *bp;
1110514Sdlw {
12*11912Sdlw 	long int pow, x, n;
13*11912Sdlw 	int zero = 0;
1410514Sdlw 
15*11912Sdlw 	pow = 1;
16*11912Sdlw 	x = *ap;
17*11912Sdlw 	n = *bp;
1810514Sdlw 
19*11912Sdlw 	if (n == 0)
20*11912Sdlw 		return ( 1L );
21*11912Sdlw 
22*11912Sdlw 	if (x == 0)
23*11912Sdlw 		return ( 0L );
24*11912Sdlw 
25*11912Sdlw 	if (x == 1)
26*11912Sdlw 		return ( 1L );
27*11912Sdlw 
28*11912Sdlw 	if (x == -1)
29*11912Sdlw 	{
30*11912Sdlw 		if (n < 0)
3110514Sdlw 		{
32*11912Sdlw 			if (n < -2)
33*11912Sdlw 				n += 2;
34*11912Sdlw 			n = -n;
35*11912Sdlw 		}
36*11912Sdlw 		if (n % 2 == 0)
37*11912Sdlw 			return ( 1L );
3810514Sdlw 		else
39*11912Sdlw 			return ( -1L );
40*11912Sdlw 	}
41*11912Sdlw 
42*11912Sdlw 	if (n > 0)
43*11912Sdlw 		for( ; ; )
44*11912Sdlw 		{
45*11912Sdlw 			if(n & 01)
46*11912Sdlw 				pow *= x;
47*11912Sdlw 			if(n >>= 1)
48*11912Sdlw 				x *= x;
49*11912Sdlw 			else
50*11912Sdlw 				break;
5110514Sdlw 		}
52*11912Sdlw 	else
53*11912Sdlw 		pow = 0;
54*11912Sdlw 
55*11912Sdlw 	return(pow);
5610514Sdlw }
57