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