SCCS-vsn: usr.bin/f77/libF77/pow_hh.c 5.2
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*
*/
short pow_hh(ap, bp)
short *ap, *bp;
{
*/
short pow_hh(ap, bp)
short *ap, *bp;
{
-pow = 1;
-x = *ap;
-n = *bp;
+ pow = 1;
+ x = *ap;
+ n = *bp;
-if(n < 0)
- { }
-else if(n > 0)
- for( ; ; )
+ if (n == 0)
+ return ( 1L );
+
+ if (x == 0)
+ {
+ if( n > 0 )
+ return ( 0L );
+ else
+ return ( 1/x );
+ }
+
+ if (x == 1)
+ return ( 1L );
+
+ if (x == -1)
+ {
+ if (n < 0)
- if(n & 01)
- pow *= x;
- if(n >>= 1)
- x *= x;
+ if (n < -2)
+ n += 2;
+ n = -n;
+ }
+ if (n % 2 == 0)
+ return ( 1L );
+ return ( -1L );
+ }
+
+ if (n > 0)
+ for( ; ; )
+ {
+ if(n & 01)
+ pow *= x;
+ if(n >>= 1)
+ x *= x;
+ else
+ break;
+ else
+ pow = 0;
+
+ return(pow);