xref: /csrg-svn/usr.bin/f77/libF77/pow_ri.c (revision 10515)
1*10515Sdlw /*
2*10515Sdlw  *	"@(#)pow_ri.c	1.1"
3*10515Sdlw  */
4*10515Sdlw 
5*10515Sdlw float pow_ri(ap, bp)
6*10515Sdlw float *ap;
7*10515Sdlw long int *bp;
8*10515Sdlw {
9*10515Sdlw double pow, x;
10*10515Sdlw long int n;
11*10515Sdlw 
12*10515Sdlw pow = 1;
13*10515Sdlw x = *ap;
14*10515Sdlw n = *bp;
15*10515Sdlw 
16*10515Sdlw if(n != 0)
17*10515Sdlw 	{
18*10515Sdlw 	if(n < 0)
19*10515Sdlw 		{
20*10515Sdlw 		if(x == 0)
21*10515Sdlw 			{
22*10515Sdlw 			return(pow);
23*10515Sdlw 			}
24*10515Sdlw 		n = -n;
25*10515Sdlw 		x = 1/x;
26*10515Sdlw 		}
27*10515Sdlw 	for( ; ; )
28*10515Sdlw 		{
29*10515Sdlw 		if(n & 01)
30*10515Sdlw 			pow *= x;
31*10515Sdlw 		if(n >>= 1)
32*10515Sdlw 			x *= x;
33*10515Sdlw 		else
34*10515Sdlw 			break;
35*10515Sdlw 		}
36*10515Sdlw 	}
37*10515Sdlw return(pow);
38*10515Sdlw }
39