xref: /csrg-svn/lib/libc/gen/frexp.c (revision 1966)
1*1966Swnj /* @(#)frexp.c	4.1 (Berkeley) 12/21/80 */
2*1966Swnj /*
3*1966Swnj 	the call
4*1966Swnj 		x = frexp(arg,&exp);
5*1966Swnj 	must return a double fp quantity x which is <1.0
6*1966Swnj 	and the corresponding binary exponent "exp".
7*1966Swnj 	such that
8*1966Swnj 		arg = x*2^exp
9*1966Swnj */
10*1966Swnj 
11*1966Swnj double
12*1966Swnj frexp(x,i)
13*1966Swnj double x;
14*1966Swnj int *i;
15*1966Swnj {
16*1966Swnj 	int neg;
17*1966Swnj 	int j;
18*1966Swnj 	j = 0;
19*1966Swnj 	neg = 0;
20*1966Swnj 	if(x<0){
21*1966Swnj 		x = -x;
22*1966Swnj 		neg = 1;
23*1966Swnj 		}
24*1966Swnj 	if(x>1.0)
25*1966Swnj 		while(x>1){
26*1966Swnj 			j = j+1;
27*1966Swnj 			x = x/2;
28*1966Swnj 			}
29*1966Swnj 	else if(x<0.5)
30*1966Swnj 		while(x<0.5){
31*1966Swnj 			j = j-1;
32*1966Swnj 			x = 2*x;
33*1966Swnj 			}
34*1966Swnj 	*i = j;
35*1966Swnj 	if(neg) x = -x;
36*1966Swnj 	return(x);
37*1966Swnj 	}
38