xref: /csrg-svn/lib/libc/gen/frexp.c (revision 46597)
126551Sdonn #if defined(LIBC_SCCS) && !defined(lint)
2*46597Sdonn static char sccsid[] = "@(#)frexp.c	5.3 (Berkeley) 02/23/91";
326551Sdonn #endif LIBC_SCCS and not lint
422088Smckusick 
5*46597Sdonn #include <math.h>
6*46597Sdonn 
71966Swnj /*
822088Smckusick  *	the call
922088Smckusick  *		x = frexp(arg,&exp);
1022088Smckusick  *	must return a double fp quantity x which is <1.0
1122088Smckusick  *	and the corresponding binary exponent "exp".
1222088Smckusick  *	such that
1322088Smckusick  *		arg = x*2^exp
1422088Smckusick  *	if the argument is 0.0, return 0.0 mantissa and 0 exponent.
1522088Smckusick  */
161966Swnj 
171966Swnj double
frexp(x,i)181966Swnj frexp(x,i)
191966Swnj double x;
201966Swnj int *i;
211966Swnj {
221966Swnj 	int neg;
231966Swnj 	int j;
241966Swnj 	j = 0;
251966Swnj 	neg = 0;
261966Swnj 	if(x<0){
271966Swnj 		x = -x;
281966Swnj 		neg = 1;
291966Swnj 		}
3016946Sralph 	if(x>=1.0)
3116946Sralph 		while(x>=1.0){
321966Swnj 			j = j+1;
331966Swnj 			x = x/2;
341966Swnj 			}
3516946Sralph 	else if(x<0.5 && x != 0.0)
361966Swnj 		while(x<0.5){
371966Swnj 			j = j-1;
381966Swnj 			x = 2*x;
391966Swnj 			}
401966Swnj 	*i = j;
411966Swnj 	if(neg) x = -x;
421966Swnj 	return(x);
431966Swnj 	}
44