xref: /freebsd/lib/msun/src/e_scalb.c (revision 59b19ff14a36bb975819fff8c7bd8648a9b29537)
13a8617a8SJordan K. Hubbard /* @(#)e_scalb.c 5.1 93/09/24 */
23a8617a8SJordan K. Hubbard /*
33a8617a8SJordan K. Hubbard  * ====================================================
43a8617a8SJordan K. Hubbard  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
53a8617a8SJordan K. Hubbard  *
63a8617a8SJordan K. Hubbard  * Developed at SunPro, a Sun Microsystems, Inc. business.
73a8617a8SJordan K. Hubbard  * Permission to use, copy, modify, and distribute this
83a8617a8SJordan K. Hubbard  * software is freely granted, provided that this notice
93a8617a8SJordan K. Hubbard  * is preserved.
103a8617a8SJordan K. Hubbard  * ====================================================
113a8617a8SJordan K. Hubbard  */
123a8617a8SJordan K. Hubbard 
133a8617a8SJordan K. Hubbard #ifndef lint
147f3dea24SPeter Wemm static char rcsid[] = "$FreeBSD$";
153a8617a8SJordan K. Hubbard #endif
163a8617a8SJordan K. Hubbard 
173a8617a8SJordan K. Hubbard /*
183a8617a8SJordan K. Hubbard  * __ieee754_scalb(x, fn) is provide for
193a8617a8SJordan K. Hubbard  * passing various standard test suite. One
203a8617a8SJordan K. Hubbard  * should use scalbn() instead.
213a8617a8SJordan K. Hubbard  */
223a8617a8SJordan K. Hubbard 
233a8617a8SJordan K. Hubbard #include "math.h"
243a8617a8SJordan K. Hubbard #include "math_private.h"
253a8617a8SJordan K. Hubbard 
263a8617a8SJordan K. Hubbard #ifdef _SCALB_INT
2759b19ff1SAlfred Perlstein double
2859b19ff1SAlfred Perlstein __generic___ieee754_scalb(double x, int fn)
293a8617a8SJordan K. Hubbard #else
3059b19ff1SAlfred Perlstein double
3159b19ff1SAlfred Perlstein __generic___ieee754_scalb(double x, double fn)
323a8617a8SJordan K. Hubbard #endif
333a8617a8SJordan K. Hubbard {
343a8617a8SJordan K. Hubbard #ifdef _SCALB_INT
353a8617a8SJordan K. Hubbard 	return scalbn(x,fn);
363a8617a8SJordan K. Hubbard #else
373a8617a8SJordan K. Hubbard 	if (isnan(x)||isnan(fn)) return x*fn;
383a8617a8SJordan K. Hubbard 	if (!finite(fn)) {
393a8617a8SJordan K. Hubbard 	    if(fn>0.0) return x*fn;
403a8617a8SJordan K. Hubbard 	    else       return x/(-fn);
413a8617a8SJordan K. Hubbard 	}
423a8617a8SJordan K. Hubbard 	if (rint(fn)!=fn) return (fn-fn)/(fn-fn);
433a8617a8SJordan K. Hubbard 	if ( fn > 65000.0) return scalbn(x, 65000);
443a8617a8SJordan K. Hubbard 	if (-fn > 65000.0) return scalbn(x,-65000);
453a8617a8SJordan K. Hubbard 	return scalbn(x,(int)fn);
463a8617a8SJordan K. Hubbard #endif
473a8617a8SJordan K. Hubbard }
48