diff options
56 files changed, 554 insertions, 911 deletions
diff --git a/docs/defines.txt b/docs/defines.txt index c1424944d..2282b335e 100644 --- a/docs/defines.txt +++ b/docs/defines.txt @@ -69,3 +69,6 @@ __UCLIBC_HAS_XXX__, __UCLIBC_HAVE_XXX__      uClibc_config.h and generated from uclibc .config file.      __UCLIBC_HAVE_XXX__ are booleans from bits/uClibc_arch_features.h      (there are more __UCLIBC_XXX defines there) + +_IEEE_LIBM +    Always defined at libm build time diff --git a/include/math.h b/include/math.h index 83a154d21..82eb0f314 100644 --- a/include/math.h +++ b/include/math.h @@ -175,6 +175,7 @@ extern long double __REDIRECT_NTH (nexttowardl,  #if defined __USE_MISC || defined __USE_XOPEN  /* This variable is used by `gamma' and `lgamma'.  */  extern int signgam; +libm_hidden_proto(signgam)  #endif diff --git a/libm/Makefile.in b/libm/Makefile.in index b490ec8bf..f86f3985e 100644 --- a/libm/Makefile.in +++ b/libm/Makefile.in @@ -66,14 +66,13 @@ libm_CSRC := \  	s_ilogb.c s_ldexp.c s_lib_version.c s_lrint.c s_lround.c s_llround.c \  	s_log1p.c s_logb.c s_matherr.c s_modf.c s_nextafter.c s_round.c \  	s_rint.c s_scalbn.c s_signgam.c s_significand.c s_sin.c s_tan.c \ -	s_tanh.c s_trunc.c w_acos.c w_acosh.c w_asin.c w_atan2.c w_atanh.c \ -	w_cabs.c w_cosh.c w_drem.c w_exp.c w_fmod.c w_gamma.c \ -	w_hypot.c w_j0.c w_j1.c w_jn.c w_lgamma.c w_lgamma_r.c \ -	w_log.c w_log2.c w_log10.c w_pow.c w_remainder.c w_scalb.c w_sinh.c \ -	w_sqrt.c nan.c carg.c s_llrint.c \ +	s_tanh.c s_trunc.c \ +	w_cabs.c w_drem.c w_gamma.c \ +	w_lgamma.c \ +	nan.c carg.c s_llrint.c \  	s_fpclassify.c s_fpclassifyf.c s_signbit.c s_signbitf.c \  	s_isnan.c s_isnanf.c s_isinf.c s_isinff.c s_finitef.c \ -	s_fdim.c s_fma.c s_fmax.c s_fmin.c s_nearbyint.c \ +	s_fdim.c s_fma.c s_fmax.c s_fmin.c \  	s_remquo.c s_scalbln.c w_exp2.c w_tgamma.c  # REMOVED: w_gamma_r.c  FL_MOBJ := \ @@ -97,10 +96,10 @@ LD_MOBJ := acoshl.o acosl.o asinhl.o asinl.o atan2l.o atanhl.o atanl.o cargl.o c  else  # This list of math functions was taken from POSIX/IEEE 1003.1b-1993  libm_CSRC := \ -	w_acos.c w_asin.c s_atan.c w_atan2.c s_ceil.c s_cos.c \ -	w_cosh.c w_exp.c s_fabs.c s_floor.c w_fmod.c s_frexp.c \ -	s_ldexp.c w_log.c w_log10.c s_modf.c w_pow.c s_sin.c \ -	w_sinh.c w_sqrt.c s_tan.c s_tanh.c \ +	s_atan.c s_ceil.c s_cos.c \ +	s_fabs.c s_floor.c s_frexp.c \ +	s_ldexp.c s_modf.c s_sin.c \ +	s_tan.c s_tanh.c \  	s_expm1.c s_scalbn.c s_copysign.c e_acos.c e_asin.c e_atan2.c \  	k_cos.c e_cosh.c e_exp.c e_fmod.c e_log.c e_log10.c e_pow.c \  	k_sin.c e_sinh.c e_sqrt.c k_tan.c e_rem_pio2.c k_rem_pio2.c \ diff --git a/libm/e_acos.c b/libm/e_acos.c index 5333b8e22..e64ac6485 100644 --- a/libm/e_acos.c +++ b/libm/e_acos.c @@ -95,3 +95,21 @@ double attribute_hidden __ieee754_acos(double x)  	    return 2.0*(df+w);  	}  } + +/* + * wrap_acos(x) + */ +#ifndef _IEEE_LIBM +double acos(double x) +{ +	double z = __ieee754_acos(x); +	if (_LIB_VERSION == _IEEE_ || isnan(x)) +		return z; +	if (fabs(x) > 1.0) +		return __kernel_standard(x, x, 1); /* acos(|x|>1) */ +	return z; +} +#else +strong_alias(__ieee754_acos, acos) +#endif +libm_hidden_def(acos) diff --git a/libm/e_acosh.c b/libm/e_acosh.c index 2c70ad7c8..219b3d64e 100644 --- a/libm/e_acosh.c +++ b/libm/e_acosh.c @@ -53,3 +53,21 @@ double attribute_hidden __ieee754_acosh(double x)  	    return log1p(t+sqrt(2.0*t+t*t));  	}  } + +/* + * wrapper acosh(x) + */ +#ifndef _IEEE_LIBM +double acosh(double x) +{ +	double z = __ieee754_acosh(x); +	if (_LIB_VERSION == _IEEE_ || isnan(x)) +		return z; +	if (x < 1.0) +		return __kernel_standard(x, x, 29); /* acosh(x<1) */ +	return z; +} +#else +strong_alias(__ieee754_acosh, acosh) +#endif +libm_hidden_def(acosh) diff --git a/libm/e_asin.c b/libm/e_asin.c index b3ab73ff8..fe5d15563 100644 --- a/libm/e_asin.c +++ b/libm/e_asin.c @@ -104,3 +104,21 @@ double attribute_hidden __ieee754_asin(double x)  	}  	if(hx>0) return t; else return -t;  } + +/* + * wrapper asin(x) + */ +#ifndef _IEEE_LIBM +double asin(double x) +{ +	double z = __ieee754_asin(x); +	if (_LIB_VERSION == _IEEE_ || isnan(x)) +		return z; +	if (fabs(x) > 1.0) +		return __kernel_standard(x, x, 2); /* asin(|x|>1) */ +	return z; +} +#else +strong_alias(__ieee754_asin, asin) +#endif +libm_hidden_def(asin) diff --git a/libm/e_atan2.c b/libm/e_atan2.c index 71c916d52..65f29240e 100644 --- a/libm/e_atan2.c +++ b/libm/e_atan2.c @@ -114,3 +114,21 @@ double attribute_hidden __ieee754_atan2(double y, double x)  	    	    return  (z-pi_lo)-pi;/* atan(-,-) */  	}  } + +/* + * wrapper atan2(y,x) + */ +#ifndef _IEEE_LIBM +double atan2(double y, double x) +{ +	double z = __ieee754_atan2(y,x); +	if (_LIB_VERSION == _IEEE_ || isnan(x) || isnan(y)) +		return z; +	if (x == 0.0 && y == 0.0) +		return __kernel_standard(y,x,3); /* atan2(+-0,+-0) */ +	return z; +} +#else +strong_alias(__ieee754_atan2, atan2) +#endif +libm_hidden_def(atan2) diff --git a/libm/e_atanh.c b/libm/e_atanh.c index 673ef0cd6..5cf4da3b8 100644 --- a/libm/e_atanh.c +++ b/libm/e_atanh.c @@ -54,3 +54,26 @@ double attribute_hidden __ieee754_atanh(double x)  	    t = 0.5*log1p((x+x)/(one-x));  	if(hx>=0) return t; else return -t;  } + +/* + * wrapper atanh(x) + */ +#ifndef _IEEE_LIBM +double atanh(double x) +{ +	double z, y; +	z = __ieee754_atanh(x); +	if (_LIB_VERSION == _IEEE_ || isnan(x)) +		return z; +	y = fabs(x); +	if (y >= 1.0) { +		if (y > 1.0) +			return __kernel_standard(x, x, 30); /* atanh(|x|>1) */ +		return __kernel_standard(x, x, 31); /* atanh(|x|==1) */ +	} +	return z; +} +#else +strong_alias(__ieee754_atanh, atanh) +#endif +libm_hidden_def(atanh) diff --git a/libm/e_cosh.c b/libm/e_cosh.c index ddfd0254b..1eb5b8303 100644 --- a/libm/e_cosh.c +++ b/libm/e_cosh.c @@ -77,3 +77,21 @@ double attribute_hidden __ieee754_cosh(double x)      /* |x| > overflowthresold, cosh(x) overflow */  	return huge*huge;  } + +/* + * wrapper cosh(x) + */ +#ifndef _IEEE_LIBM +double cosh(double x) +{ +	double z = __ieee754_cosh(x); +	if (_LIB_VERSION == _IEEE_ || isnan(x)) +		return z; +	if (fabs(x) > 7.10475860073943863426e+02) +		return __kernel_standard(x, x, 5); /* cosh overflow */ +	return z; +} +#else +strong_alias(__ieee754_cosh, cosh) +#endif +libm_hidden_def(cosh) diff --git a/libm/e_exp.c b/libm/e_exp.c index ebf2e5af0..abfb17675 100644 --- a/libm/e_exp.c +++ b/libm/e_exp.c @@ -155,3 +155,28 @@ double attribute_hidden __ieee754_exp(double x)	/* default IEEE double exp */  	    return y*twom1000;  	}  } + +/* + * wrapper exp(x) + */ +#ifndef _IEEE_LIBM +double exp(double x) +{ +	static const double o_threshold =  7.09782712893383973096e+02; /* 0x40862E42, 0xFEFA39EF */ +	static const double u_threshold = -7.45133219101941108420e+02; /* 0xc0874910, 0xD52D3051 */ + +	double z = __ieee754_exp(x); +	if (_LIB_VERSION == _IEEE_) +		return z; +	if (isfinite(x)) { +		if (x > o_threshold) +			return __kernel_standard(x, x, 6); /* exp overflow */ +		if (x < u_threshold) +			return __kernel_standard(x, x, 7); /* exp underflow */ +	} +	return z; +} +#else +strong_alias(__ieee754_exp, exp) +#endif +libm_hidden_def(exp) diff --git a/libm/e_fmod.c b/libm/e_fmod.c index 02cce63b0..503ff9254 100644 --- a/libm/e_fmod.c +++ b/libm/e_fmod.c @@ -124,3 +124,21 @@ double attribute_hidden __ieee754_fmod(double x, double y)  	}  	return x;		/* exact output */  } + +/* + * wrapper fmod(x,y) + */ +#ifndef _IEEE_LIBM +double fmod(double x, double y) +{ +	double z = __ieee754_fmod(x, y); +	if (_LIB_VERSION == _IEEE_ || isnan(y) || isnan(x)) +		return z; +	if (y == 0.0) +		return __kernel_standard(x, y, 27); /* fmod(x,0) */ +	return z; +} +#else +strong_alias(__ieee754_fmod, fmod) +#endif +libm_hidden_def(fmod) diff --git a/libm/e_gamma.c b/libm/e_gamma.c index d0809a10a..d7b7c30fe 100644 --- a/libm/e_gamma.c +++ b/libm/e_gamma.c @@ -20,8 +20,6 @@  #include <math.h>  #include "math_private.h" -libm_hidden_proto(signgam) -/* __private_extern__ */  double attribute_hidden __ieee754_gamma(double x)  {  	return __ieee754_gamma_r(x,&signgam); diff --git a/libm/e_gamma_r.c b/libm/e_gamma_r.c index 24411c7e1..9fea9279d 100644 --- a/libm/e_gamma_r.c +++ b/libm/e_gamma_r.c @@ -19,7 +19,6 @@  #include "math_private.h" -/* __private_extern__ */  double attribute_hidden __ieee754_gamma_r(double x, int *signgamp)  {  	return __ieee754_lgamma_r(x,signgamp); diff --git a/libm/e_hypot.c b/libm/e_hypot.c index 3a6b2133e..264982512 100644 --- a/libm/e_hypot.c +++ b/libm/e_hypot.c @@ -116,3 +116,21 @@ double attribute_hidden __ieee754_hypot(double x, double y)  	    return t1*w;  	} else return w;  } + +/* + * wrapper hypot(x,y) + */ +#ifndef _IEEE_LIBM +double hypot(double x, double y) +{ +	double z = __ieee754_hypot(x, y); +	if (_LIB_VERSION == _IEEE_) +		return z; +	if ((!isfinite(z)) && isfinite(x) && isfinite(y)) +		return __kernel_standard(x, y, 4); /* hypot overflow */ +	return z; +} +#else +strong_alias(__ieee754_hypot, hypot) +#endif +libm_hidden_def(hypot) diff --git a/libm/e_j0.c b/libm/e_j0.c index 0c34ceb91..ea37460c0 100644 --- a/libm/e_j0.c +++ b/libm/e_j0.c @@ -123,6 +123,23 @@ double attribute_hidden __ieee754_j0(double x)  	}  } +/* + * wrapper j0(double x) + */ +#ifndef _IEEE_LIBM +double j0(double x) +{ +	double z = __ieee754_j0(x); +	if (_LIB_VERSION == _IEEE_ || isnan(x)) +		return z; +	if (fabs(x) > X_TLOSS) +		return __kernel_standard(x, x, 34); /* j0(|x|>X_TLOSS) */ +	return z; +} +#else +strong_alias(__ieee754_j0, j0) +#endif +  static const double  u00  = -7.38042951086872317523e-02, /* 0xBFB2E4D6, 0x99CBD01F */  u01  =  1.76666452509181115538e-01, /* 0x3FC69D01, 0x9DE9E3FC */ @@ -188,6 +205,30 @@ double attribute_hidden __ieee754_y0(double x)  	return(u/v + tpi*(__ieee754_j0(x)*__ieee754_log(x)));  } +/* + * wrapper y0(double x) + */ +#ifndef _IEEE_LIBM +double y0(double x) +{ +	double z = __ieee754_y0(x); +	if (_LIB_VERSION == _IEEE_ || isnan(x)) +		return z; +	if (x <= 0.0) { +		if (x == 0.0) /* d= -one/(x-x); */ +			return __kernel_standard(x, x, 8); +		/* d = zero/(x-x); */ +		return __kernel_standard(x, x, 9); +	} +	if (x > X_TLOSS) +		return __kernel_standard(x, x, 35); /* y0(x>X_TLOSS) */ +	return z; +} +#else +strong_alias(__ieee754_y0, y0) +#endif + +  /* The asymptotic expansions of pzero is   *	1 - 9/128 s^2 + 11025/98304 s^4 - ...,	where s = 1/x.   * For x >= 2, We approximate pzero by @@ -261,7 +302,7 @@ static const double pS2[5] = {    1.46576176948256193810e+01, /* 0x402D50B3, 0x44391809 */  }; -	static double pzero(double x) +static double pzero(double x)  {  	const double *p = 0,*q = 0;  	double z,r,s; @@ -356,7 +397,7 @@ static const double qS2[6] = {   -5.31095493882666946917e+00, /* 0xC0153E6A, 0xF8B32931 */  }; -	static double qzero(double x) +static double qzero(double x)  {  	const double *p=0,*q=0;  	double s,r,z; diff --git a/libm/e_j1.c b/libm/e_j1.c index 92e15ce75..1f674e9cf 100644 --- a/libm/e_j1.c +++ b/libm/e_j1.c @@ -118,6 +118,23 @@ double attribute_hidden __ieee754_j1(double x)  	return(x*0.5+r/s);  } +/* + * wrapper of j1 + */ +#ifndef _IEEE_LIBM +double j1(double x) +{ +	double z = __ieee754_j1(x); +	if (_LIB_VERSION == _IEEE_ || isnan(x)) +		return z; +	if (fabs(x) > X_TLOSS) +		return __kernel_standard(x, x, 36); /* j1(|x|>X_TLOSS) */ +	return z; +} +#else +strong_alias(__ieee754_j1, j1) +#endif +  static const double U0[5] = {   -1.96057090646238940668e-01, /* 0xBFC91866, 0x143CBC8A */    5.04438716639811282616e-02, /* 0x3FA9D3C7, 0x76292CD1 */ @@ -181,6 +198,29 @@ double attribute_hidden __ieee754_y1(double x)          return(x*(u/v) + tpi*(__ieee754_j1(x)*__ieee754_log(x)-one/x));  } +/* + * wrapper of y1 + */ +#ifndef _IEEE_LIBM +double y1(double x) +{ +	double z = __ieee754_y1(x); +	if (_LIB_VERSION == _IEEE_ || isnan(x)) +		return z; +	if (x <= 0.0) { +		if (x == 0.0) /* d = -one/(x-x); */ +			return __kernel_standard(x, x, 10); +		/* d = zero/(x-x); */ +		return __kernel_standard(x, x, 11); +	} +	if (x > X_TLOSS) +		return __kernel_standard(x, x, 37); /* y1(x>X_TLOSS) */ +	return z; +} +#else +strong_alias(__ieee754_y1, y1) +#endif +  /* For x >= 8, the asymptotic expansions of pone is   *	1 + 15/128 s^2 - 4725/2^15 s^4 - ...,	where s = 1/x.   * We approximate pone by @@ -255,7 +295,7 @@ static const double ps2[5] = {    8.36463893371618283368e+00, /* 0x4020BAB1, 0xF44E5192 */  }; -	static double pone(double x) +static double pone(double x)  {  	const double *p=0,*q=0;  	double z,r,s; @@ -351,7 +391,7 @@ static const double qs2[6] = {   -4.95949898822628210127e+00, /* 0xC013D686, 0xE71BE86B */  }; -	static double qone(double x) +static double qone(double x)  {  	const double *p=0,*q=0;  	double  s,r,z; diff --git a/libm/e_jn.c b/libm/e_jn.c index b12a7f33a..3825bead8 100644 --- a/libm/e_jn.c +++ b/libm/e_jn.c @@ -200,6 +200,23 @@ double attribute_hidden __ieee754_jn(int n, double x)  	if(sgn==1) return -b; else return b;  } +/* + * wrapper jn(int n, double x) + */ +#ifndef _IEEE_LIBM +double jn(int n, double x) +{ +	double z = __ieee754_jn(n, x); +	if (_LIB_VERSION == _IEEE_ || isnan(x)) +		return z; +	if (fabs(x) > X_TLOSS) +		return __kernel_standard((double)n, x, 38); /* jn(|x|>X_TLOSS,n) */ +	return z; +} +#else +strong_alias(__ieee754_jn, jn) +#endif +  double attribute_hidden __ieee754_yn(int n, double x)  {  	int32_t i,hx,ix,lx; @@ -256,3 +273,26 @@ double attribute_hidden __ieee754_yn(int n, double x)  	}  	if(sign>0) return b; else return -b;  } + +/* + * wrapper yn(int n, double x) + */ +#ifndef _IEEE_LIBM +double yn(int n, double x)	/* wrapper yn */ +{ +	double z = __ieee754_yn(n, x); +	if (_LIB_VERSION == _IEEE_ || isnan(x)) +		return z; +	if (x <= 0.0) { +		if(x == 0.0) /* d= -one/(x-x); */ +			return __kernel_standard((double)n, x, 12); +		/* d = zero/(x-x); */ +		return __kernel_standard((double)n, x, 13); +	} +	if (x > X_TLOSS) +		return __kernel_standard((double)n, x, 39); /* yn(x>X_TLOSS,n) */ +	return z; +} +#else +strong_alias(__ieee754_yn, yn) +#endif diff --git a/libm/e_lgamma.c b/libm/e_lgamma.c index 9bc9da60b..b9838c48a 100644 --- a/libm/e_lgamma.c +++ b/libm/e_lgamma.c @@ -20,8 +20,6 @@  #include <math.h>  #include "math_private.h" -libm_hidden_proto(signgam) -/* __private_extern__ */  double attribute_hidden __ieee754_lgamma(double x)  {  	return __ieee754_lgamma_r(x,&signgam); diff --git a/libm/e_lgamma_r.c b/libm/e_lgamma_r.c index b578a2cea..5aacadcfd 100644 --- a/libm/e_lgamma_r.c +++ b/libm/e_lgamma_r.c @@ -291,3 +291,46 @@ double attribute_hidden __ieee754_lgamma_r(double x, int *signgamp)  	if(hx<0) r = nadj - r;  	return r;  } + +/* + * wrapper double lgamma_r(double x, int *signgamp) + */ +#ifndef _IEEE_LIBM +double lgamma_r(double x, int *signgamp) +{ +	double y = __ieee754_lgamma_r(x, signgamp); +	if (_LIB_VERSION == _IEEE_) +		return y; +	if (!isfinite(y) && isfinite(x)) { +		if (floor(x) == x && x <= 0.0) +			return __kernel_standard(x, x, 15); /* lgamma pole */ +		return __kernel_standard(x, x, 14); /* lgamma overflow */ +	} +	return y; +} +#else +strong_alias(__ieee754_lgamma_r, lgamma_r) +#endif + +/* + * wrapper double gamma_r(double x, int *signgamp) + */ +double gamma_r(double x, int *signgamp); +libm_hidden_proto(gamma_r) +#ifndef _IEEE_LIBM +double gamma_r(double x, int *signgamp) +{ +	double y = __ieee754_lgamma_r(x, signgamp); +	if (_LIB_VERSION == _IEEE_) +		return y; +	if (!isfinite(y) && isfinite(x)) { +		if (floor(x) == x && x <= 0.0) +			return __kernel_standard(x, x, 41); /* gamma pole */ +		return __kernel_standard(x, x, 40); /* gamma overflow */ +	} +	return y; +} +#else +strong_alias(__ieee754_lgamma_r, gamma_r) +#endif +libm_hidden_def(gamma_r) diff --git a/libm/e_log.c b/libm/e_log.c index 721746a16..4a82b6e50 100644 --- a/libm/e_log.c +++ b/libm/e_log.c @@ -127,3 +127,21 @@ double attribute_hidden __ieee754_log(double x)  		     return dk*ln2_hi-((s*(f-R)-dk*ln2_lo)-f);  	}  } + +/* + * wrapper log(x) + */ +#ifndef _IEEE_LIBM +double log(double x) +{ +	double z = __ieee754_log(x); +	if (_LIB_VERSION == _IEEE_ || isnan(x) || x > 0.0) +		return z; +	if (x == 0.0) +		return __kernel_standard(x, x, 16); /* log(0) */ +	return __kernel_standard(x, x, 17); /* log(x<0) */ +} +#else +strong_alias(__ieee754_log, log) +#endif +libm_hidden_def(log) diff --git a/libm/e_log10.c b/libm/e_log10.c index 6cf3ea4ee..ff2241e56 100644 --- a/libm/e_log10.c +++ b/libm/e_log10.c @@ -78,3 +78,24 @@ double attribute_hidden __ieee754_log10(double x)  	z  = y*log10_2lo + ivln10*__ieee754_log(x);  	return  z+y*log10_2hi;  } + +/* + * wrapper log10(X) + */ +#ifndef _IEEE_LIBM +double log10(double x) +{ +	double z = __ieee754_log10(x); +	if (_LIB_VERSION == _IEEE_ || isnan(x)) +		return z; +	if (x <= 0.0) { +		if(x == 0.0) +			return __kernel_standard(x, x, 18); /* log10(0) */ +		return __kernel_standard(x, x, 19); /* log10(x<0) */ +	} +	return z; +} +#else +strong_alias(__ieee754_log10, log10) +#endif +libm_hidden_def(log10) diff --git a/libm/e_log2.c b/libm/e_log2.c index 6df88491e..70e604b3c 100644 --- a/libm/e_log2.c +++ b/libm/e_log2.c @@ -115,3 +115,4 @@ double __ieee754_log2(double x)  	    return dk-((s*(f-R))-f)/ln2;  	}  } +strong_alias(__ieee754_log2,log2) diff --git a/libm/e_pow.c b/libm/e_pow.c index 08670cce3..137f600c3 100644 --- a/libm/e_pow.c +++ b/libm/e_pow.c @@ -292,3 +292,40 @@ double attribute_hidden __ieee754_pow(double x, double y)  	else SET_HIGH_WORD(z,j);  	return s*z;  } + +/* + * wrapper pow(x,y) return x**y + */ +#ifndef _IEEE_LIBM +double pow(double x, double y) +{ +	double z = __ieee754_pow(x, y); +	if (_LIB_VERSION == _IEEE_|| isnan(y)) +		return z; +	if (isnan(x)) { +		if (y == 0.0) +			return __kernel_standard(x, y, 42); /* pow(NaN,0.0) */ +		return z; +	} +	if (x == 0.0) { +		if (y == 0.0) +	    		return __kernel_standard(x, y, 20); /* pow(0.0,0.0) */ +		if (isfinite(y) && y < 0.0) +			return __kernel_standard(x,y,23); /* pow(0.0,negative) */ +		return z; +	} +	if (!isfinite(z)) { +		if (isfinite(x) && isfinite(y)) { +			if (isnan(z)) +				return __kernel_standard(x, y, 24); /* pow neg**non-int */ +			return __kernel_standard(x, y, 21); /* pow overflow */ +		} +	} +	if (z == 0.0 && isfinite(x) && isfinite(y)) +		return __kernel_standard(x, y, 22); /* pow underflow */ +	return z; +} +#else +strong_alias(__ieee754_pow, pow) +#endif +libm_hidden_def(pow) diff --git a/libm/e_remainder.c b/libm/e_remainder.c index 89c616686..c4972cfdd 100644 --- a/libm/e_remainder.c +++ b/libm/e_remainder.c @@ -63,3 +63,21 @@ double attribute_hidden __ieee754_remainder(double x, double p)  	SET_HIGH_WORD(x,hx^sx);  	return x;  } + +/* + * wrapper remainder(x,p) + */ +#ifndef _IEEE_LIBM +double remainder(double x, double y) +{ +	double z = __ieee754_remainder(x, y); +	if (_LIB_VERSION == _IEEE_ || isnan(y)) +		return z; +	if (y == 0.0) +		return __kernel_standard(x, y, 28); /* remainder(x,0) */ +	return z; +} +#else +strong_alias(__ieee754_remainder, remainder) +#endif +libm_hidden_def(remainder) 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 diff --git a/libm/e_sinh.c b/libm/e_sinh.c index 7194b21b9..972307e6f 100644 --- a/libm/e_sinh.c +++ b/libm/e_sinh.c @@ -70,3 +70,21 @@ double attribute_hidden __ieee754_sinh(double x)      /* |x| > overflowthresold, sinh(x) overflow */  	return x*shuge;  } + +/* + * wrapper sinh(x) + */ +#ifndef _IEEE_LIBM +double sinh(double x) +{ +	double z = __ieee754_sinh(x); +	if (_LIB_VERSION == _IEEE_) +		return z; +	if (!isfinite(z) && isfinite(x)) +		return __kernel_standard(x, x, 25); /* sinh overflow */ +	return z; +} +#else +strong_alias(__ieee754_sinh, sinh) +#endif +libm_hidden_def(sinh) diff --git a/libm/e_sqrt.c b/libm/e_sqrt.c index 884214dff..05e255c2f 100644 --- a/libm/e_sqrt.c +++ b/libm/e_sqrt.c @@ -181,6 +181,25 @@ double attribute_hidden __ieee754_sqrt(double x)  }  /* + * wrapper sqrt(x) + */ +#ifndef _IEEE_LIBM +double sqrt(double x) +{ +	double z = __ieee754_sqrt(x); +	if (_LIB_VERSION == _IEEE_ || isnan(x)) +		return z; +	if (x < 0.0) +		return __kernel_standard(x, x, 26); /* sqrt(negative) */ +	return z; +} +#else +strong_alias(__ieee754_sqrt, sqrt) +#endif +libm_hidden_def(sqrt) + + +/*  Other methods  (use floating-point arithmetic)  -------------  (This is a copy of a drafted paper by Prof W. Kahan @@ -436,4 +455,3 @@ B.  sqrt(x) by Reciproot Iteration      (4)	Special cases (see (4) of Section A).   */ - diff --git a/libm/s_matherr.c b/libm/s_matherr.c index 3ab059362..9a50459c8 100644 --- a/libm/s_matherr.c +++ b/libm/s_matherr.c @@ -14,7 +14,7 @@  #ifndef _IEEE_LIBM -	int matherr(struct exception *x) +int matherr(struct exception *x)  {  	int n=0;  	if(x->arg1!=x->arg1) return 0; diff --git a/libm/s_rint.c b/libm/s_rint.c index 641e57571..358ce76b4 100644 --- a/libm/s_rint.c +++ b/libm/s_rint.c @@ -71,3 +71,6 @@ double rint(double x)  	return w-TWO52[sx];  }  libm_hidden_def(rint) + +strong_alias(rint, nearbyint) +libm_hidden_def(nearbyint) diff --git a/libm/s_signgam.c b/libm/s_signgam.c index 13d2a1c34..eee5d659e 100644 --- a/libm/s_signgam.c +++ b/libm/s_signgam.c @@ -1,5 +1,4 @@  #include "math.h"  #include "math_private.h" -libm_hidden_proto(signgam)  int signgam = 0;  libm_hidden_def(signgam) diff --git a/libm/w_acos.c b/libm/w_acos.c deleted file mode 100644 index 2413d87d9..000000000 --- a/libm/w_acos.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -/* - * wrap_acos(x) - */ - -#include "math.h" -#include "math_private.h" - -double acos(double x)		/* wrapper acos */ -{ -#ifdef _IEEE_LIBM -	return __ieee754_acos(x); -#else -	double z; -	z = __ieee754_acos(x); -	if(_LIB_VERSION == _IEEE_ || isnan(x)) return z; -	if(fabs(x)>1.0) { -	        return __kernel_standard(x,x,1); /* acos(|x|>1) */ -	} else -	    return z; -#endif -} -libm_hidden_def(acos) diff --git a/libm/w_acosh.c b/libm/w_acosh.c deleted file mode 100644 index 98dc1b3af..000000000 --- a/libm/w_acosh.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -/* - * wrapper acosh(x) - */ - -#include "math.h" -#include "math_private.h" - -double acosh(double x)		/* wrapper acosh */ -{ -#ifdef _IEEE_LIBM -	return __ieee754_acosh(x); -#else -	double z; -	z = __ieee754_acosh(x); -	if(_LIB_VERSION == _IEEE_ || isnan(x)) return z; -	if(x<1.0) { -	        return __kernel_standard(x,x,29); /* acosh(x<1) */ -	} else -	    return z; -#endif -} -libm_hidden_def(acosh) diff --git a/libm/w_asin.c b/libm/w_asin.c deleted file mode 100644 index b4575654e..000000000 --- a/libm/w_asin.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -/* - * wrapper asin(x) - */ - -#include "math.h" -#include "math_private.h" - -double asin(double x)		/* wrapper asin */ -{ -#ifdef _IEEE_LIBM -	return __ieee754_asin(x); -#else -	double z; -	z = __ieee754_asin(x); -	if(_LIB_VERSION == _IEEE_ || isnan(x)) return z; -	if(fabs(x)>1.0) { -	        return __kernel_standard(x,x,2); /* asin(|x|>1) */ -	} else -	    return z; -#endif -} -libm_hidden_def(asin) diff --git a/libm/w_atan2.c b/libm/w_atan2.c deleted file mode 100644 index a85e2047b..000000000 --- a/libm/w_atan2.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -/* - * wrapper atan2(y,x) - */ - -#include "math.h" -#include "math_private.h" - -double atan2(double y, double x)	/* wrapper atan2 */ -{ -#ifdef _IEEE_LIBM -	return __ieee754_atan2(y,x); -#else -	double z; -	z = __ieee754_atan2(y,x); -	if(_LIB_VERSION == _IEEE_||isnan(x)||isnan(y)) return z; -	if(x==0.0&&y==0.0) { -	        return __kernel_standard(y,x,3); /* atan2(+-0,+-0) */ -	} else -	    return z; -#endif -} -libm_hidden_def(atan2) diff --git a/libm/w_atanh.c b/libm/w_atanh.c deleted file mode 100644 index 6dffe6ad6..000000000 --- a/libm/w_atanh.c +++ /dev/null @@ -1,37 +0,0 @@ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -/* - * wrapper atanh(x) - */ - -#include "math.h" -#include "math_private.h" - -double atanh(double x)		/* wrapper atanh */ -{ -#ifdef _IEEE_LIBM -	return __ieee754_atanh(x); -#else -	double z,y; -	z = __ieee754_atanh(x); -	if(_LIB_VERSION == _IEEE_ || isnan(x)) return z; -	y = fabs(x); -	if(y>=1.0) { -	    if(y>1.0) -	        return __kernel_standard(x,x,30); /* atanh(|x|>1) */ -	    else -	        return __kernel_standard(x,x,31); /* atanh(|x|==1) */ -	} else -	    return z; -#endif -} -libm_hidden_def(atanh) diff --git a/libm/w_cosh.c b/libm/w_cosh.c deleted file mode 100644 index d37952447..000000000 --- a/libm/w_cosh.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -/* - * wrapper cosh(x) - */ - -#include "math.h" -#include "math_private.h" - -double cosh(double x)		/* wrapper cosh */ -{ -#ifdef _IEEE_LIBM -	return __ieee754_cosh(x); -#else -	double z; -	z = __ieee754_cosh(x); -	if(_LIB_VERSION == _IEEE_ || isnan(x)) return z; -	if(fabs(x)>7.10475860073943863426e+02) { -	        return __kernel_standard(x,x,5); /* cosh overflow */ -	} else -	    return z; -#endif -} -libm_hidden_def(cosh) diff --git a/libm/w_exp.c b/libm/w_exp.c deleted file mode 100644 index bd9af7ae5..000000000 --- a/libm/w_exp.c +++ /dev/null @@ -1,40 +0,0 @@ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -/* - * wrapper exp(x) - */ - -#include "math.h" -#include "math_private.h" - -double exp(double x)		/* wrapper exp */ -{ -#ifdef _IEEE_LIBM -	return __ieee754_exp(x); -#else -	static const double -	o_threshold=  7.09782712893383973096e+02,  /* 0x40862E42, 0xFEFA39EF */ -	u_threshold= -7.45133219101941108420e+02;  /* 0xc0874910, 0xD52D3051 */ - -	double z; -	z = __ieee754_exp(x); -	if(_LIB_VERSION == _IEEE_) return z; -	if(isfinite(x)) { -	    if(x>o_threshold) -	        return __kernel_standard(x,x,6); /* exp overflow */ -	    else if(x<u_threshold) -	        return __kernel_standard(x,x,7); /* exp underflow */ -	} -	return z; -#endif -} -libm_hidden_def(exp) diff --git a/libm/w_exp2.c b/libm/w_exp2.c index 20fb9c28e..e00277abf 100644 --- a/libm/w_exp2.c +++ b/libm/w_exp2.c @@ -14,6 +14,6 @@  double exp2(double x)  { -  return pow(2.0, x); +	return pow(2.0, x);  }  libm_hidden_def(exp2) diff --git a/libm/w_fmod.c b/libm/w_fmod.c deleted file mode 100644 index ba0897d14..000000000 --- a/libm/w_fmod.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -/* - * wrapper fmod(x,y) - */ - -#include "math.h" -#include "math_private.h" - -double fmod(double x, double y)	/* wrapper fmod */ -{ -#ifdef _IEEE_LIBM -	return __ieee754_fmod(x,y); -#else -	double z; -	z = __ieee754_fmod(x,y); -	if(_LIB_VERSION == _IEEE_ ||isnan(y)||isnan(x)) return z; -	if(y==0.0) { -	        return __kernel_standard(x,y,27); /* fmod(x,0) */ -	} else -	    return z; -#endif -} -libm_hidden_def(fmod) diff --git a/libm/w_gamma.c b/libm/w_gamma.c index 4b23392ed..246c8f764 100644 --- a/libm/w_gamma.c +++ b/libm/w_gamma.c @@ -18,21 +18,19 @@  #include <math.h>  #include "math_private.h" -libm_hidden_proto(signgam)  double gamma(double x)  {  #ifdef _IEEE_LIBM -	return __ieee754_lgamma_r(x,&signgam); +	return __ieee754_lgamma_r(x, &signgam);  #else -        double y; -        y = __ieee754_lgamma_r(x,&signgam); -        if(_LIB_VERSION == _IEEE_) return y; -        if(!isfinite(y)&&isfinite(x)) { -            if(floor(x)==x&&x<=0.0) -                return __kernel_standard(x,x,41); /* gamma pole */ -            else -                return __kernel_standard(x,x,40); /* gamma overflow */ -        } else -            return y; +	double y = __ieee754_lgamma_r(x, &signgam); +	if (_LIB_VERSION == _IEEE_) +		return y; +	if (!isfinite(y) && isfinite(x)) { +		if (floor(x) == x && x <= 0.0) +			return __kernel_standard(x, x, 41); /* gamma pole */ +		return __kernel_standard(x, x, 40); /* gamma overflow */ +	} +	return y;  #endif  } diff --git a/libm/w_gamma_r.c b/libm/w_gamma_r.c deleted file mode 100644 index 04a843ca7..000000000 --- a/libm/w_gamma_r.c +++ /dev/null @@ -1,39 +0,0 @@ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -/* - * wrapper double gamma_r(double x, int *signgamp) - */ - -#include "math.h" -#include "math_private.h" - -double gamma_r(double x, int *signgamp); -libm_hidden_proto(gamma_r) - -double gamma_r(double x, int *signgamp) /* wrapper lgamma_r */ -{ -#ifdef _IEEE_LIBM -	return __ieee754_lgamma_r(x,signgamp); -#else -        double y; -        y = __ieee754_lgamma_r(x,signgamp); -        if(_LIB_VERSION == _IEEE_) return y; -        if(!isfinite(y)&&isfinite(x)) { -            if(floor(x)==x&&x<=0.0) -                return __kernel_standard(x,x,41); /* gamma pole */ -            else -                return __kernel_standard(x,x,40); /* gamma overflow */ -        } else -            return y; -#endif -} -libm_hidden_def(gamma_r) diff --git a/libm/w_hypot.c b/libm/w_hypot.c deleted file mode 100644 index 02e8977dc..000000000 --- a/libm/w_hypot.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -/* - * wrapper hypot(x,y) - */ - -#include "math.h" -#include "math_private.h" - -double hypot(double x, double y)/* wrapper hypot */ -{ -#ifdef _IEEE_LIBM -	return __ieee754_hypot(x,y); -#else -	double z; -	z = __ieee754_hypot(x,y); -	if(_LIB_VERSION == _IEEE_) return z; -	if((!isfinite(z))&&isfinite(x)&&isfinite(y)) -	    return __kernel_standard(x,y,4); /* hypot overflow */ -	else -	    return z; -#endif -} -libm_hidden_def(hypot) diff --git a/libm/w_j0.c b/libm/w_j0.c deleted file mode 100644 index 2cd03082d..000000000 --- a/libm/w_j0.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -/* - * wrapper j0(double x), y0(double x) - */ - -#include "math.h" -#include "math_private.h" - -double j0(double x)		/* wrapper j0 */ -{ -#ifdef _IEEE_LIBM -	return __ieee754_j0(x); -#else -	double z = __ieee754_j0(x); -	if(_LIB_VERSION == _IEEE_ || isnan(x)) return z; -	if(fabs(x)>X_TLOSS) { -	        return __kernel_standard(x,x,34); /* j0(|x|>X_TLOSS) */ -	} else -	    return z; -#endif -} - -double y0(double x)		/* wrapper y0 */ -{ -#ifdef _IEEE_LIBM -	return __ieee754_y0(x); -#else -	double z; -	z = __ieee754_y0(x); -	if(_LIB_VERSION == _IEEE_ || isnan(x) ) return z; -        if(x <= 0.0){ -                if(x==0.0) -                    /* d= -one/(x-x); */ -                    return __kernel_standard(x,x,8); -                else -                    /* d = zero/(x-x); */ -                    return __kernel_standard(x,x,9); -        } -	if(x>X_TLOSS) { -	        return __kernel_standard(x,x,35); /* y0(x>X_TLOSS) */ -	} else -	    return z; -#endif -} diff --git a/libm/w_j1.c b/libm/w_j1.c deleted file mode 100644 index 18af1126b..000000000 --- a/libm/w_j1.c +++ /dev/null @@ -1,55 +0,0 @@ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -/* - * wrapper of j1,y1 - */ - -#include "math.h" -#include "math_private.h" - -double j1(double x)		/* wrapper j1 */ -{ -#ifdef _IEEE_LIBM -	return __ieee754_j1(x); -#else -	double z; -	z = __ieee754_j1(x); -	if(_LIB_VERSION == _IEEE_ || isnan(x) ) return z; -	if(fabs(x)>X_TLOSS) { -	        return __kernel_standard(x,x,36); /* j1(|x|>X_TLOSS) */ -	} else -	    return z; -#endif -} - -double y1(double x)		/* wrapper y1 */ -{ -#ifdef _IEEE_LIBM -	return __ieee754_y1(x); -#else -	double z; -	z = __ieee754_y1(x); -	if(_LIB_VERSION == _IEEE_ || isnan(x) ) return z; -        if(x <= 0.0){ -                if(x==0.0) -                    /* d= -one/(x-x); */ -                    return __kernel_standard(x,x,10); -                else -                    /* d = zero/(x-x); */ -                    return __kernel_standard(x,x,11); -        } -	if(x>X_TLOSS) { -	        return __kernel_standard(x,x,37); /* y1(x>X_TLOSS) */ -	} else -	    return z; -#endif -} diff --git a/libm/w_jn.c b/libm/w_jn.c deleted file mode 100644 index 9ec64c60d..000000000 --- a/libm/w_jn.c +++ /dev/null @@ -1,77 +0,0 @@ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -/* - * wrapper jn(int n, double x), yn(int n, double x) - * floating point Bessel's function of the 1st and 2nd kind - * of order n - * - * Special cases: - *	y0(0)=y1(0)=yn(n,0) = -inf with division by zero signal; - *	y0(-ve)=y1(-ve)=yn(n,-ve) are NaN with invalid signal. - * Note 2. About jn(n,x), yn(n,x) - *	For n=0, j0(x) is called, - *	for n=1, j1(x) is called, - *	for n<x, forward recursion us used starting - *	from values of j0(x) and j1(x). - *	for n>x, a continued fraction approximation to - *	j(n,x)/j(n-1,x) is evaluated and then backward - *	recursion is used starting from a supposed value - *	for j(n,x). The resulting value of j(0,x) is - *	compared with the actual value to correct the - *	supposed value of j(n,x). - * - *	yn(n,x) is similar in all respects, except - *	that forward recursion is used for all - *	values of n>1. - * - */ - -#include "math.h" -#include "math_private.h" - -double jn(int n, double x)	/* wrapper jn */ -{ -#ifdef _IEEE_LIBM -	return __ieee754_jn(n,x); -#else -	double z; -	z = __ieee754_jn(n,x); -	if(_LIB_VERSION == _IEEE_ || isnan(x) ) return z; -	if(fabs(x)>X_TLOSS) { -	    return __kernel_standard((double)n,x,38); /* jn(|x|>X_TLOSS,n) */ -	} else -	    return z; -#endif -} - -double yn(int n, double x)	/* wrapper yn */ -{ -#ifdef _IEEE_LIBM -	return __ieee754_yn(n,x); -#else -	double z; -	z = __ieee754_yn(n,x); -	if(_LIB_VERSION == _IEEE_ || isnan(x) ) return z; -        if(x <= 0.0){ -                if(x==0.0) -                    /* d= -one/(x-x); */ -                    return __kernel_standard((double)n,x,12); -                else -                    /* d = zero/(x-x); */ -                    return __kernel_standard((double)n,x,13); -        } -	if(x>X_TLOSS) { -	    return __kernel_standard((double)n,x,39); /* yn(x>X_TLOSS,n) */ -	} else -	    return z; -#endif -} diff --git a/libm/w_lgamma.c b/libm/w_lgamma.c index 95bd41330..9ef9051f1 100644 --- a/libm/w_lgamma.c +++ b/libm/w_lgamma.c @@ -18,22 +18,20 @@  #include <math.h>  #include "math_private.h" -libm_hidden_proto(signgam)  double lgamma(double x)  {  #ifdef _IEEE_LIBM -	return __ieee754_lgamma_r(x,&signgam); +	return __ieee754_lgamma_r(x, &signgam);  #else -        double y; -        y = __ieee754_lgamma_r(x,&signgam); -        if(_LIB_VERSION == _IEEE_) return y; -        if(!isfinite(y)&&isfinite(x)) { -            if(floor(x)==x&&x<=0.0) -                return __kernel_standard(x,x,15); /* lgamma pole */ -            else -                return __kernel_standard(x,x,14); /* lgamma overflow */ -        } else -            return y; +	double y = __ieee754_lgamma_r(x, &signgam); +	if (_LIB_VERSION == _IEEE_) +		return y; +	if (!isfinite(y) && isfinite(x)) { +		if (floor(x) == x && x <= 0.0) +			return __kernel_standard(x, x, 15); /* lgamma pole */ +		return __kernel_standard(x, x, 14); /* lgamma overflow */ +	} +	return y;  #endif  }  libm_hidden_def(lgamma) diff --git a/libm/w_lgamma_r.c b/libm/w_lgamma_r.c deleted file mode 100644 index f4ba60553..000000000 --- a/libm/w_lgamma_r.c +++ /dev/null @@ -1,35 +0,0 @@ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -/* - * wrapper double lgamma_r(double x, int *signgamp) - */ - -#include "math.h" -#include "math_private.h" - -double lgamma_r(double x, int *signgamp) /* wrapper lgamma_r */ -{ -#ifdef _IEEE_LIBM -	return __ieee754_lgamma_r(x,signgamp); -#else -        double y; -        y = __ieee754_lgamma_r(x,signgamp); -        if(_LIB_VERSION == _IEEE_) return y; -        if(!isfinite(y)&&isfinite(x)) { -            if(floor(x)==x&&x<=0.0) -                return __kernel_standard(x,x,15); /* lgamma pole */ -            else -                return __kernel_standard(x,x,14); /* lgamma overflow */ -        } else -            return y; -#endif -} diff --git a/libm/w_log.c b/libm/w_log.c deleted file mode 100644 index 0f7a1eea9..000000000 --- a/libm/w_log.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -/* - * wrapper log(x) - */ - -#include "math.h" -#include "math_private.h" - -double log(double x)		/* wrapper log */ -{ -#ifdef _IEEE_LIBM -	return __ieee754_log(x); -#else -	double z; -	z = __ieee754_log(x); -	if(_LIB_VERSION == _IEEE_ || isnan(x) || x > 0.0) return z; -	if(x==0.0) -	    return __kernel_standard(x,x,16); /* log(0) */ -	else -	    return __kernel_standard(x,x,17); /* log(x<0) */ -#endif -} -libm_hidden_def(log) diff --git a/libm/w_log10.c b/libm/w_log10.c deleted file mode 100644 index ee6c1fe46..000000000 --- a/libm/w_log10.c +++ /dev/null @@ -1,36 +0,0 @@ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -/* - * wrapper log10(X) - */ - -#include "math.h" -#include "math_private.h" - -double log10(double x)		/* wrapper log10 */ -{ -#ifdef _IEEE_LIBM -	return __ieee754_log10(x); -#else -	double z; -	z = __ieee754_log10(x); -	if(_LIB_VERSION == _IEEE_ || isnan(x)) return z; -	if(x<=0.0) { -	    if(x==0.0) -	        return __kernel_standard(x,x,18); /* log10(0) */ -	    else -	        return __kernel_standard(x,x,19); /* log10(x<0) */ -	} else -	    return z; -#endif -} -libm_hidden_def(log10) diff --git a/libm/w_log2.c b/libm/w_log2.c deleted file mode 100644 index b5cc65952..000000000 --- a/libm/w_log2.c +++ /dev/null @@ -1,14 +0,0 @@ -/* vi: set sw=4 ts=4: */ -/* - * Copyright (C) 2008 by Bernhard Reutner-Fischer <uclibc@uclibc.org> - * - * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. - */ - -#include <math.h> -#include "math_private.h" - -double log2(double d) -{ -	return __ieee754_log2(d); -} diff --git a/libm/w_pow.c b/libm/w_pow.c deleted file mode 100644 index 7062aeae6..000000000 --- a/libm/w_pow.c +++ /dev/null @@ -1,55 +0,0 @@ - - -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -/* - * wrapper pow(x,y) return x**y - */ - -#include "math.h" -#include "math_private.h" - -double pow(double x, double y)	/* wrapper pow */ -{ -#ifdef _IEEE_LIBM -	return  __ieee754_pow(x,y); -#else -	double z; -	z=__ieee754_pow(x,y); -	if(_LIB_VERSION == _IEEE_|| isnan(y)) return z; -	if(isnan(x)) { -	    if(y==0.0) -	        return __kernel_standard(x,y,42); /* pow(NaN,0.0) */ -	    else -		return z; -	} -	if(x==0.0){ -	    if(y==0.0) -	        return __kernel_standard(x,y,20); /* pow(0.0,0.0) */ -	    if(isfinite(y)&&y<0.0) -	        return __kernel_standard(x,y,23); /* pow(0.0,negative) */ -	    return z; -	} -	if(!isfinite(z)) { -	    if(isfinite(x)&&isfinite(y)) { -	        if(isnan(z)) -	            return __kernel_standard(x,y,24); /* pow neg**non-int */ -	        else -	            return __kernel_standard(x,y,21); /* pow overflow */ -	    } -	} -	if(z==0.0&&isfinite(x)&&isfinite(y)) -	    return __kernel_standard(x,y,22); /* pow underflow */ -	return z; -#endif -} -libm_hidden_def(pow) diff --git a/libm/w_remainder.c b/libm/w_remainder.c deleted file mode 100644 index 5de1ee811..000000000 --- a/libm/w_remainder.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -/* - * wrapper remainder(x,p) - */ - -#include "math.h" -#include "math_private.h" - -double remainder(double x, double y)	/* wrapper remainder */ -{ -#ifdef _IEEE_LIBM -	return __ieee754_remainder(x,y); -#else -	double z; -	z = __ieee754_remainder(x,y); -	if(_LIB_VERSION == _IEEE_ || isnan(y)) return z; -	if(y==0.0) -	    return __kernel_standard(x,y,28); /* remainder(x,0) */ -	else -	    return z; -#endif -} -libm_hidden_def(remainder) diff --git a/libm/w_scalb.c b/libm/w_scalb.c deleted file mode 100644 index 0e3475131..000000000 --- a/libm/w_scalb.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -/* - * wrapper scalb(double x, double fn) is provide for - * passing various standard test suite. One - * should use scalbn() instead. - */ - -#include <math.h> -#include "math_private.h" - -#include <errno.h> - -#ifdef _SCALB_INT -double scalb(double x, int fn)		/* wrapper scalb */ -#else -double scalb(double x, double fn)	/* wrapper scalb */ -#endif -{ -#ifdef _IEEE_LIBM -	return __ieee754_scalb(x,fn); -#else -	double z; -	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; -#endif -} diff --git a/libm/w_sinh.c b/libm/w_sinh.c deleted file mode 100644 index e7e5ae855..000000000 --- a/libm/w_sinh.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -/* - * wrapper sinh(x) - */ - -#include "math.h" -#include "math_private.h" - -double sinh(double x)		/* wrapper sinh */ -{ -#ifdef _IEEE_LIBM -	return __ieee754_sinh(x); -#else -	double z; -	z = __ieee754_sinh(x); -	if(_LIB_VERSION == _IEEE_) return z; -	if(!isfinite(z)&&isfinite(x)) { -	    return __kernel_standard(x,x,25); /* sinh overflow */ -	} else -	    return z; -#endif -} -libm_hidden_def(sinh) diff --git a/libm/w_sqrt.c b/libm/w_sqrt.c deleted file mode 100644 index 6b6f4b767..000000000 --- a/libm/w_sqrt.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -/* - * wrapper sqrt(x) - */ - -#include "math.h" -#include "math_private.h" - -double sqrt(double x)		/* wrapper sqrt */ -{ -#ifdef _IEEE_LIBM -	return __ieee754_sqrt(x); -#else -	double z; -	z = __ieee754_sqrt(x); -	if(_LIB_VERSION == _IEEE_ || isnan(x)) return z; -	if(x<0.0) { -	    return __kernel_standard(x,x,26); /* sqrt(negative) */ -	} else -	    return z; -#endif -} -libm_hidden_def(sqrt) diff --git a/libm/w_tgamma.c b/libm/w_tgamma.c index 15723c5d6..3ad473b2f 100644 --- a/libm/w_tgamma.c +++ b/libm/w_tgamma.c @@ -17,25 +17,23 @@  #include "math.h"  #include "math_private.h" -libm_hidden_proto(signgam)  double tgamma(double x)  {          double y;  	int local_signgam; -	y = __ieee754_gamma_r(x,&local_signgam); -	if (local_signgam < 0) y = -y; -#ifdef _IEEE_LIBM -	return y; -#else -	if(_LIB_VERSION == _IEEE_) return y; -	if(!isfinite(y)&&isfinite(x)) { -	  if(floor(x)==x&&x<=0.0) -	    return __kernel_standard(x,x,41); /* tgamma pole */ -	  else -	    return __kernel_standard(x,x,40); /* tgamma overflow */ +	y = __ieee754_gamma_r(x, &local_signgam); +	if (local_signgam < 0) +		y = -y; +#ifndef _IEEE_LIBM +	if (_LIB_VERSION == _IEEE_) +		return y; +	if (!isfinite(y) && isfinite(x)) { +		if (floor(x) == x && x <= 0.0) +			return __kernel_standard(x, x, 41); /* tgamma pole */ +		return __kernel_standard(x, x, 40); /* tgamma overflow */  	} -	return y;  #endif +	return y;  }  libm_hidden_def(tgamma)  | 
