xref: /csrg-svn/lib/libc/gen/frexp.c (revision 16946)
1*16946Sralph /* @(#)frexp.c	4.2 (Berkeley) 08/16/84 */
21966Swnj /*
31966Swnj 	the call
41966Swnj 		x = frexp(arg,&exp);
51966Swnj 	must return a double fp quantity x which is <1.0
61966Swnj 	and the corresponding binary exponent "exp".
71966Swnj 	such that
81966Swnj 		arg = x*2^exp
9*16946Sralph 	if the argument is 0.0, return 0.0 mantissa and 0 exponent.
101966Swnj */
111966Swnj 
121966Swnj double
131966Swnj frexp(x,i)
141966Swnj double x;
151966Swnj int *i;
161966Swnj {
171966Swnj 	int neg;
181966Swnj 	int j;
191966Swnj 	j = 0;
201966Swnj 	neg = 0;
211966Swnj 	if(x<0){
221966Swnj 		x = -x;
231966Swnj 		neg = 1;
241966Swnj 		}
25*16946Sralph 	if(x>=1.0)
26*16946Sralph 		while(x>=1.0){
271966Swnj 			j = j+1;
281966Swnj 			x = x/2;
291966Swnj 			}
30*16946Sralph 	else if(x<0.5 && x != 0.0)
311966Swnj 		while(x<0.5){
321966Swnj 			j = j-1;
331966Swnj 			x = 2*x;
341966Swnj 			}
351966Swnj 	*i = j;
361966Swnj 	if(neg) x = -x;
371966Swnj 	return(x);
381966Swnj 	}
39