1: /* 2: * Copyright (c) 1980 Regents of the University of California. 3: * All rights reserved. The Berkeley software License Agreement 4: * specifies the terms and conditions for redistribution. 5: * 6: * @(#)pow_ii.c 5.3 6/26/85 7: * 8: * Corrections by Robert P. Corbett, 1983 March 2 9: * Revised to restore portability, 1983 March 4 10: */ 11: 12: 13: long int pow_ii(ap, bp) 14: long int *ap, *bp; 15: { 16: long int pow, x, n; 17: 18: pow = 1; 19: x = *ap; 20: n = *bp; 21: 22: if (n == 0) 23: return ( 1L ); 24: 25: if (x == 0) 26: { 27: if( n > 0 ) 28: return ( 0L ); 29: else 30: return ( 1/x ); 31: } 32: 33: if (x == 1) 34: return ( 1L ); 35: 36: if (x == -1) 37: { 38: if (n < 0) 39: { 40: if (n < -2) 41: n += 2; 42: n = -n; 43: } 44: if (n % 2 == 0) 45: return ( 1L ); 46: else 47: return ( -1L ); 48: } 49: 50: if (n > 0) 51: for( ; ; ) 52: { 53: if(n & 01) 54: pow *= x; 55: if(n >>= 1) 56: x *= x; 57: else 58: break; 59: } 60: else 61: pow = 0; 62: 63: return(pow); 64: }