xref: /freebsd/lib/msun/src/e_scalb.c (revision 0dd5a5603e7a33d976f8e6015620bbc79839c609)
13f708241SDavid Schultz 
23a8617a8SJordan K. Hubbard /*
33a8617a8SJordan K. Hubbard  * ====================================================
43a8617a8SJordan K. Hubbard  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
53a8617a8SJordan K. Hubbard  *
63f708241SDavid Schultz  * Developed at SunSoft, 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 /*
14*99843eb8SSteve Kargl  * scalb(x, fn) is provide for
153a8617a8SJordan K. Hubbard  * passing various standard test suite. One
163a8617a8SJordan K. Hubbard  * should use scalbn() instead.
173a8617a8SJordan K. Hubbard  */
183a8617a8SJordan K. Hubbard 
193a8617a8SJordan K. Hubbard #include "math.h"
203a8617a8SJordan K. Hubbard #include "math_private.h"
213a8617a8SJordan K. Hubbard 
223a8617a8SJordan K. Hubbard #ifdef _SCALB_INT
2359b19ff1SAlfred Perlstein double
scalb(double x,int fn)24*99843eb8SSteve Kargl scalb(double x, int fn)
253a8617a8SJordan K. Hubbard #else
2659b19ff1SAlfred Perlstein double
27*99843eb8SSteve Kargl scalb(double x, double fn)
283a8617a8SJordan K. Hubbard #endif
293a8617a8SJordan K. Hubbard {
303a8617a8SJordan K. Hubbard #ifdef _SCALB_INT
313a8617a8SJordan K. Hubbard 	return scalbn(x,fn);
323a8617a8SJordan K. Hubbard #else
333f708241SDavid Schultz 	if (isnan(x)||isnan(fn)) return x*fn;
343a8617a8SJordan K. Hubbard 	if (!finite(fn)) {
353a8617a8SJordan K. Hubbard 	    if(fn>0.0) return x*fn;
363a8617a8SJordan K. Hubbard 	    else       return x/(-fn);
373a8617a8SJordan K. Hubbard 	}
383a8617a8SJordan K. Hubbard 	if (rint(fn)!=fn) return (fn-fn)/(fn-fn);
393a8617a8SJordan K. Hubbard 	if ( fn > 65000.0) return scalbn(x, 65000);
403a8617a8SJordan K. Hubbard 	if (-fn > 65000.0) return scalbn(x,-65000);
413a8617a8SJordan K. Hubbard 	return scalbn(x,(int)fn);
423a8617a8SJordan K. Hubbard #endif
433a8617a8SJordan K. Hubbard }
44