xref: /csrg-svn/lib/libc/gen/frexp.c (revision 26551)
1*26551Sdonn #if defined(LIBC_SCCS) && !defined(lint)
2*26551Sdonn static char sccsid[] = "@(#)frexp.c	5.2 (Berkeley) 03/09/86";
3*26551Sdonn #endif LIBC_SCCS and not lint
422088Smckusick 
51966Swnj /*
622088Smckusick  *	the call
722088Smckusick  *		x = frexp(arg,&exp);
822088Smckusick  *	must return a double fp quantity x which is <1.0
922088Smckusick  *	and the corresponding binary exponent "exp".
1022088Smckusick  *	such that
1122088Smckusick  *		arg = x*2^exp
1222088Smckusick  *	if the argument is 0.0, return 0.0 mantissa and 0 exponent.
1322088Smckusick  */
141966Swnj 
151966Swnj double
161966Swnj frexp(x,i)
171966Swnj double x;
181966Swnj int *i;
191966Swnj {
201966Swnj 	int neg;
211966Swnj 	int j;
221966Swnj 	j = 0;
231966Swnj 	neg = 0;
241966Swnj 	if(x<0){
251966Swnj 		x = -x;
261966Swnj 		neg = 1;
271966Swnj 		}
2816946Sralph 	if(x>=1.0)
2916946Sralph 		while(x>=1.0){
301966Swnj 			j = j+1;
311966Swnj 			x = x/2;
321966Swnj 			}
3316946Sralph 	else if(x<0.5 && x != 0.0)
341966Swnj 		while(x<0.5){
351966Swnj 			j = j-1;
361966Swnj 			x = 2*x;
371966Swnj 			}
381966Swnj 	*i = j;
391966Swnj 	if(neg) x = -x;
401966Swnj 	return(x);
411966Swnj 	}
42