Add missing libgcc_s.h header.
[uclibc-ng.git] / libm / e_scalb.c
blob9244cf42f756a5d07a98432bab09d52d17e27b0f
1 /*
2 * ====================================================
3 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
5 * Developed at SunPro, a Sun Microsystems, Inc. business.
6 * Permission to use, copy, modify, and distribute this
7 * software is freely granted, provided that this notice
8 * is preserved.
9 * ====================================================
13 * __ieee754_scalb(x, fn) is provide for
14 * passing various standard test suite. One
15 * should use scalbn() instead.
18 #include "math.h"
19 #include "math_private.h"
20 #include <errno.h>
22 double attribute_hidden __ieee754_scalb(double x, double fn)
24 return scalbn(x,fn);
25 if (isnan(x)||isnan(fn)) return x*fn;
26 if (!isfinite(fn)) {
27 if(fn>0.0) return x*fn;
28 else return x/(-fn);
30 if (rint(fn)!=fn) return (fn-fn)/(fn-fn);
31 if ( fn > 65000.0) return scalbn(x, 65000);
32 if (-fn > 65000.0) return scalbn(x,-65000);
33 return scalbn(x,(int)fn);
36 #if defined __UCLIBC_SUSV3_LEGACY__
38 * wrapper scalb(double x, double fn) is provide for
39 * passing various standard test suite. One
40 * should use scalbn() instead.
42 #ifndef _IEEE_LIBM
43 double scalb(double x, double fn)
45 double z = __ieee754_scalb(x, fn);
46 if (_LIB_VERSION == _IEEE_)
47 return z;
48 if (!(isfinite(z) || isnan(z)) && isfinite(x))
49 return __kernel_standard(x, (double)fn, 32); /* scalb overflow */
50 if (z == 0.0 && z != x)
51 return __kernel_standard(x, (double)fn, 33); /* scalb underflow */
52 if (!isfinite(fn))
53 errno = ERANGE;
54 return z;
56 #else
57 strong_alias(__ieee754_scalb, scalb)
58 #endif
60 #endif /* UCLIBC_SUSV3_LEGACY */