xref: /haiku/src/system/libroot/posix/musl/math/scalb.c (revision f504f61099b010fbfa94b1cc63d2e9072c7f7185)
1*f504f610SAugustin Cavalier /* origin: FreeBSD /usr/src/lib/msun/src/e_scalb.c */
2*f504f610SAugustin Cavalier /*
3*f504f610SAugustin Cavalier  * ====================================================
4*f504f610SAugustin Cavalier  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
5*f504f610SAugustin Cavalier  *
6*f504f610SAugustin Cavalier  * Developed at SunSoft, a Sun Microsystems, Inc. business.
7*f504f610SAugustin Cavalier  * Permission to use, copy, modify, and distribute this
8*f504f610SAugustin Cavalier  * software is freely granted, provided that this notice
9*f504f610SAugustin Cavalier  * is preserved.
10*f504f610SAugustin Cavalier  * ====================================================
11*f504f610SAugustin Cavalier  */
12*f504f610SAugustin Cavalier /*
13*f504f610SAugustin Cavalier  * scalb(x, fn) is provide for
14*f504f610SAugustin Cavalier  * passing various standard test suite. One
15*f504f610SAugustin Cavalier  * should use scalbn() instead.
16*f504f610SAugustin Cavalier  */
17*f504f610SAugustin Cavalier 
18*f504f610SAugustin Cavalier #define _GNU_SOURCE
19*f504f610SAugustin Cavalier #include <math.h>
20*f504f610SAugustin Cavalier 
scalb(double x,double fn)21*f504f610SAugustin Cavalier double scalb(double x, double fn)
22*f504f610SAugustin Cavalier {
23*f504f610SAugustin Cavalier 	if (isnan(x) || isnan(fn))
24*f504f610SAugustin Cavalier 		return x*fn;
25*f504f610SAugustin Cavalier 	if (!isfinite(fn)) {
26*f504f610SAugustin Cavalier 		if (fn > 0.0)
27*f504f610SAugustin Cavalier 			return x*fn;
28*f504f610SAugustin Cavalier 		else
29*f504f610SAugustin Cavalier 			return x/(-fn);
30*f504f610SAugustin Cavalier 	}
31*f504f610SAugustin Cavalier 	if (rint(fn) != fn) return (fn-fn)/(fn-fn);
32*f504f610SAugustin Cavalier 	if ( fn > 65000.0) return scalbn(x, 65000);
33*f504f610SAugustin Cavalier 	if (-fn > 65000.0) return scalbn(x,-65000);
34*f504f610SAugustin Cavalier 	return scalbn(x,(int)fn);
35*f504f610SAugustin Cavalier }
36