diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-12-28 22:15:07 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-12-28 22:15:07 +0000 |
commit | 30bd4a6cc3a093fdb32db26ee8bc30cd7ef47622 (patch) | |
tree | 01723c9bffa22959927c97216fa24ff1107bfd46 /libm/e_scalb.c | |
parent | de87f81d41ef95772db9e0616e6ae31f5894eda7 (diff) |
remove many functions which just call __ieee754_<function>,
define them as aliases instead.
text data bss dec hex filename
- 45402 180 4 45586 b212 lib/libm-0.9.30-svn.so
+ 45302 180 4 45486 b1ae lib/libm-0.9.30-svn.so
Diffstat (limited to 'libm/e_scalb.c')
-rw-r--r-- | libm/e_scalb.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/libm/e_scalb.c b/libm/e_scalb.c index f43fe6dd5..db3639683 100644 --- a/libm/e_scalb.c +++ b/libm/e_scalb.c @@ -17,6 +17,7 @@ #include "math.h" #include "math_private.h" +#include <errno.h> #ifdef _SCALB_INT double attribute_hidden __ieee754_scalb(double x, int fn) @@ -26,6 +27,7 @@ double attribute_hidden __ieee754_scalb(double x, double fn) { #ifdef _SCALB_INT return scalbn(x,fn); +//TODO: just alias it to scalbn? #else if (isnan(x)||isnan(fn)) return x*fn; if (!isfinite(fn)) { @@ -38,3 +40,32 @@ double attribute_hidden __ieee754_scalb(double x, double fn) return scalbn(x,(int)fn); #endif } + +/* + * wrapper scalb(double x, double fn) is provide for + * passing various standard test suite. One + * should use scalbn() instead. + */ +#ifndef _IEEE_LIBM +# ifdef _SCALB_INT +double scalb(double x, int fn) +# else +double scalb(double x, double fn) +# endif +{ + double z = __ieee754_scalb(x, fn); + if (_LIB_VERSION == _IEEE_) + return z; + if (!(isfinite(z) || isnan(z)) && isfinite(x)) + return __kernel_standard(x, (double)fn, 32); /* scalb overflow */ + if (z == 0.0 && z != x) + return __kernel_standard(x, (double)fn, 33); /* scalb underflow */ +# ifndef _SCALB_INT + if (!isfinite(fn)) + errno = ERANGE; +# endif + return z; +} +#else +strong_alias(__ieee754_scalb, scalb) +#endif |