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