diff options
-rw-r--r-- | libm/e_scalb.c | 13 | ||||
-rw-r--r-- | libm/math_private.h | 4 | ||||
-rw-r--r-- | libm/s_ldexp.c | 22 |
3 files changed, 19 insertions, 20 deletions
diff --git a/libm/e_scalb.c b/libm/e_scalb.c index ff0c77523..7e6768810 100644 --- a/libm/e_scalb.c +++ b/libm/e_scalb.c @@ -19,16 +19,9 @@ #include "math_private.h" #include <errno.h> -#ifdef _SCALB_INT -double attribute_hidden __ieee754_scalb(double x, int fn) -#else double attribute_hidden __ieee754_scalb(double x, double fn) -#endif { -#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)) { if(fn>0.0) return x*fn; @@ -48,11 +41,7 @@ double attribute_hidden __ieee754_scalb(double x, double fn) * 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_) @@ -61,10 +50,8 @@ double scalb(double x, double fn) 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 diff --git a/libm/math_private.h b/libm/math_private.h index 80c270718..bdd0aba48 100644 --- a/libm/math_private.h +++ b/libm/math_private.h @@ -176,11 +176,7 @@ extern double __ieee754_jn (int,double) attribute_hidden; extern double __ieee754_yn (int,double) attribute_hidden; extern double __ieee754_remainder (double,double) attribute_hidden; extern int __ieee754_rem_pio2 (double,double*) attribute_hidden; -#if defined(_SCALB_INT) -extern double __ieee754_scalb (double,int) attribute_hidden; -#else extern double __ieee754_scalb (double,double) attribute_hidden; -#endif /* fdlibm kernel function */ #ifndef _IEEE_LIBM diff --git a/libm/s_ldexp.c b/libm/s_ldexp.c index 1b681cb81..b2809afc8 100644 --- a/libm/s_ldexp.c +++ b/libm/s_ldexp.c @@ -13,11 +13,27 @@ #include "math_private.h" #include <errno.h> +/* TODO: POSIX says: + * + * "If the integer expression (math_errhandling & MATH_ERRNO) is non-zero, + * then errno shall be set to [ERANGE]. If the integer expression + * (math_errhandling & MATH_ERREXCEPT) is non-zero, then the underflow + * floating-point exception shall be raised." + * + * *And it says the same about scalbn*! Thus these two functions + * are the same and can be just aliased. + * + * Currently, ldexp tries to be vaguely POSIX compliant while scalbn + * does not (it does not set ERRNO). + */ + double ldexp(double value, int exp) { - if(!isfinite(value)||value==0.0) return value; - value = scalbn(value,exp); - if(!isfinite(value)||value==0.0) errno = ERANGE; + if (!isfinite(value) || value == 0.0) + return value; + value = scalbn(value, exp); + if (!isfinite(value) || value == 0.0) + errno = ERANGE; return value; } libm_hidden_def(ldexp) |