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