xref: /csrg-svn/usr.bin/f77/libF77/pow_ii.c (revision 22937)
110514Sdlw /*
2*22937Skre  * Copyright (c) 1980 Regents of the University of California.
3*22937Skre  * All rights reserved.  The Berkeley software License Agreement
4*22937Skre  * specifies the terms and conditions for redistribution.
511912Sdlw  *
6*22937Skre  *	@(#)pow_ii.c	5.1	06/07/85
7*22937Skre  */
811912Sdlw  *  Corrections by Robert P. Corbett, 1983 March 2
911912Sdlw  *  Revised to restore portability, 1983 March 4
1010514Sdlw  */
1110514Sdlw 
1211912Sdlw 
1310514Sdlw long int pow_ii(ap, bp)
1410514Sdlw long int *ap, *bp;
1510514Sdlw {
1611912Sdlw 	long int pow, x, n;
1711912Sdlw 	int zero = 0;
1810514Sdlw 
1911912Sdlw 	pow = 1;
2011912Sdlw 	x = *ap;
2111912Sdlw 	n = *bp;
2210514Sdlw 
2311912Sdlw 	if (n == 0)
2411912Sdlw 		return ( 1L );
2511912Sdlw 
2611912Sdlw 	if (x == 0)
2711912Sdlw 		return ( 0L );
2811912Sdlw 
2911912Sdlw 	if (x == 1)
3011912Sdlw 		return ( 1L );
3111912Sdlw 
3211912Sdlw 	if (x == -1)
3311912Sdlw 	{
3411912Sdlw 		if (n < 0)
3510514Sdlw 		{
3611912Sdlw 			if (n < -2)
3711912Sdlw 				n += 2;
3811912Sdlw 			n = -n;
3911912Sdlw 		}
4011912Sdlw 		if (n % 2 == 0)
4111912Sdlw 			return ( 1L );
4210514Sdlw 		else
4311912Sdlw 			return ( -1L );
4411912Sdlw 	}
4511912Sdlw 
4611912Sdlw 	if (n > 0)
4711912Sdlw 		for( ; ; )
4811912Sdlw 		{
4911912Sdlw 			if(n & 01)
5011912Sdlw 				pow *= x;
5111912Sdlw 			if(n >>= 1)
5211912Sdlw 				x *= x;
5311912Sdlw 			else
5411912Sdlw 				break;
5510514Sdlw 		}
5611912Sdlw 	else
5711912Sdlw 		pow = 0;
5811912Sdlw 
5911912Sdlw 	return(pow);
6010514Sdlw }
61