xref: /csrg-svn/usr.bin/f77/libF77/pow_hh.c (revision 47940)
1*47940Sbostic /*-
2*47940Sbostic  * Copyright (c) 1980 The Regents of the University of California.
3*47940Sbostic  * All rights reserved.
422936Skre  *
5*47940Sbostic  * %sccs.include.proprietary.c%
610513Sdlw  */
710513Sdlw 
8*47940Sbostic #ifndef lint
9*47940Sbostic static char sccsid[] = "@(#)pow_hh.c	5.3 (Berkeley) 04/12/91";
10*47940Sbostic #endif /* not lint */
11*47940Sbostic 
pow_hh(ap,bp)1210513Sdlw short pow_hh(ap, bp)
1310513Sdlw short *ap, *bp;
1410513Sdlw {
1523778Sjerry 	short int pow, x, n;
1610513Sdlw 
1723778Sjerry 	pow = 1;
1823778Sjerry 	x = *ap;
1923778Sjerry 	n = *bp;
2010513Sdlw 
2123778Sjerry 	if (n == 0)
2223778Sjerry 		return ( 1L );
2323778Sjerry 
2423778Sjerry 	if (x == 0)
2523778Sjerry 	{
2623778Sjerry 		if( n > 0 )
2723778Sjerry 			return ( 0L );
2823778Sjerry 		else
2923778Sjerry 			return ( 1/x );
3023778Sjerry 	}
3123778Sjerry 
3223778Sjerry 	if (x == 1)
3323778Sjerry 		return ( 1L );
3423778Sjerry 
3523778Sjerry 	if (x == -1)
3623778Sjerry 	{
3723778Sjerry 		if (n < 0)
3810513Sdlw 		{
3923778Sjerry 			if (n < -2)
4023778Sjerry 				n += 2;
4123778Sjerry 			n = -n;
4223778Sjerry 		}
4323778Sjerry 		if (n % 2 == 0)
4423778Sjerry 			return ( 1L );
4510513Sdlw 		else
4623778Sjerry 			return ( -1L );
4723778Sjerry 	}
4823778Sjerry 
4923778Sjerry 	if (n > 0)
5023778Sjerry 		for( ; ; )
5123778Sjerry 		{
5223778Sjerry 			if(n & 01)
5323778Sjerry 				pow *= x;
5423778Sjerry 			if(n >>= 1)
5523778Sjerry 				x *= x;
5623778Sjerry 			else
5723778Sjerry 				break;
5810513Sdlw 		}
5923778Sjerry 	else
6023778Sjerry 		pow = 0;
6123778Sjerry 
6223778Sjerry 	return(pow);
6310513Sdlw }
64