summaryrefslogtreecommitdiff
path: root/math
diff options
context:
space:
mode:
Diffstat (limited to 'math')
-rw-r--r--math/Makefile12
-rw-r--r--math/bits/cmathcalls.h (renamed from math/cmathcalls.h)2
-rw-r--r--math/bits/mathcalls.h (renamed from math/mathcalls.h)2
-rw-r--r--math/complex.h14
-rw-r--r--math/fenv.h4
-rw-r--r--math/libm-test.c58
-rw-r--r--math/libm.map105
-rw-r--r--math/math.h22
-rw-r--r--math/math_private.h10
9 files changed, 190 insertions, 39 deletions
diff --git a/math/Makefile b/math/Makefile
index bd4506b99e..4f2537d680 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -21,15 +21,17 @@
subdir := math
# Installed header files.
-headers := math.h mathcalls.h __math.h huge_val.h nan.h \
- fpu_control.h complex.h cmathcalls.h fenv.h \
- fenvbits.h mathbits.h
+headers := math.h bits/mathcalls.h bits/mathinline.h bits/huge_val.h \
+ bits/nan.h fpu_control.h complex.h bits/cmathcalls.h \
+ fenv.h bits/fenv.h bits/mathdef.h
# Internal header files.
distribute := math_private.h machine/asm.h machine/endian.h
# FPU support code.
-aux := fpu_control setfpucw
+aux := fpu_control setfpucw s_matherr
+
+static-only-routines := s_matherr
# Build the -lm library.
@@ -38,7 +40,7 @@ extra-libs-others = $(extra-libs)
libm-map := libm.map
-libm-support = k_standard s_lib_version s_matherr s_signgam \
+libm-support = k_standard s_lib_version s_signgam \
s_lrint s_llrint s_lround s_llround \
fclrexcpt fgetexcptflg fraiseexcpt fsetexcptflg \
ftestexcept fegetround fesetround fegetenv feholdexcpt \
diff --git a/math/cmathcalls.h b/math/bits/cmathcalls.h
index 1f74f56e0b..d94e764930 100644
--- a/math/cmathcalls.h
+++ b/math/bits/cmathcalls.h
@@ -42,7 +42,7 @@
both a `NAME' and a `NAMEf' that takes `float' arguments. */
#ifndef _COMPLEX_H
- #error "Never include cmathcalls.h directly; include <complex.h> instead."
+#error "Never use <bits/cmathcalls.h> directly; include <complex.h> instead."
#endif
#define _Mdouble_complex_ _Mdouble_ complex
diff --git a/math/mathcalls.h b/math/bits/mathcalls.h
index 735b5953a7..e0bf1008d3 100644
--- a/math/mathcalls.h
+++ b/math/bits/mathcalls.h
@@ -41,7 +41,7 @@
both a `NAME' and a `NAMEf' that takes `float' arguments. */
#ifndef _MATH_H
- #error "Never include mathcalls.h directly; include <math.h> instead."
+ #error "Never include <bits/mathcalls.h> directly; include <math.h> instead."
#endif
diff --git a/math/complex.h b/math/complex.h
index 938823b5fb..fe4c4ce545 100644
--- a/math/complex.h
+++ b/math/complex.h
@@ -21,8 +21,8 @@
*/
#ifndef _COMPLEX_H
-
#define _COMPLEX_H 1
+
#include <features.h>
__BEGIN_DECLS
@@ -52,9 +52,9 @@ __BEGIN_DECLS
#define CX_LIMITED_RANGE_DEFAULT
-/* The file <cmathcalls.h> contains the prototypes for all the actual
- math functions. These macros are used for those prototypes, so
- we can easily declare each function as both `name' and `__name',
+/* The file <bits/cmathcalls.h> contains the prototypes for all the
+ actual math functions. These macros are used for those prototypes,
+ so we can easily declare each function as both `name' and `__name',
and can declare the float versions `namef' and `__namef'. */
#define __MATHCALL(function, args) \
@@ -67,7 +67,7 @@ __BEGIN_DECLS
#define _Mdouble_ double
#define __MATH_PRECNAME(name) name
-#include <cmathcalls.h>
+#include <bits/cmathcalls.h>
#undef _Mdouble_
#undef __MATH_PRECNAME
@@ -81,7 +81,7 @@ __BEGIN_DECLS
#else
#define __MATH_PRECNAME(name) name/**/f
#endif
-#include <cmathcalls.h>
+#include <bits/cmathcalls.h>
#undef _Mdouble_
#undef __MATH_PRECNAME
@@ -96,7 +96,7 @@ __BEGIN_DECLS
#else
#define __MATH_PRECNAME(name) name/**/l
#endif
-#include <cmathcalls.h>
+#include <bits/cmathcalls.h>
#undef _Mdouble_
#undef __MATH_PRECNAME
#undef __MATHDECL_1
diff --git a/math/fenv.h b/math/fenv.h
index e4dff29a2e..aa524b7a16 100644
--- a/math/fenv.h
+++ b/math/fenv.h
@@ -21,8 +21,8 @@
*/
#ifndef _FENV_H
-
#define _FENV_H 1
+
#include <features.h>
/* Get the architecture dependend definitions. The following definitions
@@ -55,7 +55,7 @@
FE_DOWNWARD round toward -Inf
FE_TOWARDZERO round toward 0
*/
-#include <fenvbits.h>
+#include <bits/fenv.h>
__BEGIN_DECLS
diff --git a/math/libm-test.c b/math/libm-test.c
index 5bf968f844..2b149f739a 100644
--- a/math/libm-test.c
+++ b/math/libm-test.c
@@ -56,7 +56,7 @@
ccos, ccosh, cexp, clog, cpow, csin, csinh, csqrt, ctanh.
At the moment the following functions aren't tested:
- cabs, carg, conj, cproj, cimag, creal, drem,
+ cabs, carg, conj, cproj, cimag, creal, ctan, drem,
j0, j1, jn, y0, y1, yn,
significand,
nan, comparison macros (isless,isgreater,...).
@@ -814,6 +814,14 @@ check_isinfn_exc (const char *test_name, MATHTYPE computed,
}
+/* This is to prevent messages from the SVID libm emulation. */
+int
+matherr (struct exception *x __attribute__ ((unused)))
+{
+ return 1;
+}
+
+
/****************************************************************************
Test for single functions of libm
****************************************************************************/
@@ -1298,10 +1306,15 @@ signbit_test (void)
}
-
+/*
+ gamma has different semantics depending on _LIB_VERSION:
+ if _LIB_VERSION is _SVID, gamma is just an alias for lgamma,
+ otherwise gamma is the real gamma function as definied in ISO C 9X.
+*/
static void
gamma_test (void)
{
+ int save_lib_version = _LIB_VERSION;
errno = 0;
FUNC(gamma) (0);
if (errno == ENOSYS)
@@ -1309,6 +1322,40 @@ gamma_test (void)
return;
feclearexcept (FE_ALL_EXCEPT);
+
+ _LIB_VERSION = _SVID_;
+
+ check_isinfp ("gamma (+inf) == +inf", FUNC(gamma) (plus_infty));
+ check_isinfp_exc ("gamma (0) == +inf plus divide by zero exception",
+ FUNC(gamma) (0), DIVIDE_BY_ZERO_EXCEPTION);
+
+ check_isinfp_exc ("gamma (x) == +inf plus divide by zero exception for integer x <= 0",
+ FUNC(gamma) (-3), DIVIDE_BY_ZERO_EXCEPTION);
+ check_isnan_exc ("gamma (-inf) == NaN plus invalid exception",
+ FUNC(gamma) (minus_infty), INVALID_EXCEPTION);
+
+ signgam = 0;
+ check ("gamma (1) == 0", FUNC(gamma) (1), 0);
+ check_int ("gamma (0) sets signgam to 1", signgam, 1);
+
+ signgam = 0;
+ check ("gamma (3) == M_LN2", FUNC(gamma) (3), M_LN2);
+ check_int ("gamma (3) sets signgam to 1", signgam, 1);
+
+ signgam = 0;
+ check_eps ("gamma (0.5) == log(sqrt(pi))", FUNC(gamma) (0.5),
+ FUNC(log) (FUNC(sqrt) (M_PI)), CHOOSE (0, 1e-15, 1e-7));
+ check_int ("gamma (0.5) sets signgam to 1", signgam, 1);
+
+ signgam = 0;
+ check_eps ("gamma (-0.5) == log(2*sqrt(pi))", FUNC(gamma) (-0.5),
+ FUNC(log) (2*FUNC(sqrt) (M_PI)), CHOOSE (0, 1e-15, 0));
+
+ check_int ("gamma (-0.5) sets signgam to -1", signgam, -1);
+
+
+ _LIB_VERSION = _IEEE_;
+
check_isinfp ("gamma (+inf) == +inf", FUNC(gamma) (plus_infty));
check_isnan_exc ("gamma (0) == NaN plus invalid exception",
FUNC(gamma) (0), INVALID_EXCEPTION);
@@ -1326,6 +1373,7 @@ gamma_test (void)
check ("gamma (1) == 1", FUNC(gamma) (1), 1);
check ("gamma (4) == 6", FUNC(gamma) (4), 6);
+ _LIB_VERSION = save_lib_version;
}
@@ -1348,16 +1396,20 @@ lgamma_test (void)
check_isnan_exc ("lgamma (-inf) == NaN plus invalid exception",
FUNC(lgamma) (minus_infty), INVALID_EXCEPTION);
+ signgam = 0;
check ("lgamma (1) == 0", FUNC(lgamma) (1), 0);
check_int ("lgamma (0) sets signgam to 1", signgam, 1);
+ signgam = 0;
check ("lgamma (3) == M_LN2", FUNC(lgamma) (3), M_LN2);
check_int ("lgamma (3) sets signgam to 1", signgam, 1);
+ signgam = 0;
check_eps ("lgamma (0.5) == log(sqrt(pi))", FUNC(lgamma) (0.5),
FUNC(log) (FUNC(sqrt) (M_PI)), CHOOSE (0, 1e-15, 1e-7));
check_int ("lgamma (0.5) sets signgam to 1", signgam, 1);
+ signgam = 0;
check_eps ("lgamma (-0.5) == log(2*sqrt(pi))", FUNC(lgamma) (-0.5),
FUNC(log) (2*FUNC(sqrt) (M_PI)), CHOOSE (0, 1e-15, 0));
@@ -4725,7 +4777,7 @@ basic_tests (void)
check_bool ("NaN != NaN", NaN_var != NaN_var);
/*
- the same tests but this time with NAN from <nan.h>
+ the same tests but this time with NAN from <bits/nan.h>
NAN is a double const
*/
check_bool ("isnan (NAN)", isnan (NAN));
diff --git a/math/libm.map b/math/libm.map
index b7c9b363d9..aff0ccd73f 100644
--- a/math/libm.map
+++ b/math/libm.map
@@ -1,16 +1,111 @@
GLIBC_2.0 {
global:
- # all functions and variables in the normal name space
- a*; b*; c*; d*; e*; f*; g*; h*; i*; j*; k*; l*; m*;
- n*; o*; p*; q*; r*; s*; t*; u*; v*; w*; x*; y*; z*;
+ # mathematical functions
+ acos; acosf; acosl;
+ acosh; acoshf; acoshl;
+ asin; asinf; asinl;
+ asinh; asinhf; asinhl;
+ atan2; atan2f; atan2l;
+ atan; atanf; atanl;
+ atanh; atanhf; atanhl;
+ cbrt; cbrtf; cbrtl;
+ ceil; ceilf; ceill;
+ copysign; copysignf; copysignl;
+ cos; cosf; cosl;
+ coshf; cosh; coshl;
+ drem; dremf; dreml;
+ erf; erff; erfl;
+ erfc; erfcf; erfcl;
+ exp2; exp2f; exp2l;
+ exp; expf; expl;
+ expm1; expm1f; expm1l;
+ fabs; fabsf; fabsl;
+ fdim; fdimf; fdiml;
+ finite; finitef; finitel;
+ floor; floorf; floorl;
+ fmax; fmaxf; fmaxl;
+ fmin; fminf; fminl;
+ fmod; fmodf; fmodl;
+ frexp; frexpf; frexpl;
+ gamma; gammaf; gammal;
+ gamma_r; gammaf_r; gammal_r;
+ hypot; hypotf; hypotl;
+ ilogb; ilogbf; ilogbl;
+ j0; j0f; j0l;
+ j1; j1f; j1l;
+ jn; jnf; jnl;
+ ldexp; ldexpf; ldexpl;
+ lgamma; lgammaf; lgammal;
+ lgamma_r; lgammaf_r; lgammal_r;
+ log10; log10f; log10l;
+ log1p; log1pf; log1pl;
+ log2; log2f; log2l;
+ log; logf; logl;
+ logb; logbf; logbl;
+ matherr;
+ modf; modff; modfl;
+ nan; nanf; nanl;
+ nearbyint; nearbyintf; nearbyintl;
+ nextafter; nextafterf; nextafterl;
+ pow; powf; powl;
+ remainder; remainderf; remainderl;
+ remquo; remquof; remquol;
+ rint; rintf; rintl;
+ lrint; llrint;
+ round; roundf; roundl;
+ lround; llround;
+ scalb; scalbf; scalbl;
+ scalbn; scalbnf; scalbnl;
+ significand; significandf; significandl;
+ sin; sinf; sinl;
+ sincos; sincosf; sincosl;
+ sinh; sinhf; sinhl;
+ sqrt; sqrtf; sqrtl;
+ tan; tanf; tanl;
+ tanh; tanhf; tanhl;
+ trunc; truncf; truncl;
+ y0; y0f; y0l;
+ y1; y1f; y1l;
+ yn; ynf; ynl;
+
+ # complex functions
+ cabs; cabsf; cabsl;
+ cacos; cacosf; cacosl;
+ cacosh; cacoshf; cacoshl;
+ carg; cargf; cargl;
+ casin; casinf; casinl;
+ casinh; casinhf; casinhl;
+ catan; catanf; catanl;
+ catanh; catanhf; catanhl;
+ ccos; ccosf; ccosl;
+ ccosh; ccoshf; ccoshl;
+ cexp; cexpf; cexpl;
+ cimag; cimagf; cimagl;
+ clog; clogf; clogl;
+ conj; conjf; conjl;
+ cpow; cpowf; cpowl;
+ cproj; cprojf; cprojl;
+ creal; crealf; creall;
+ csin; csinf; csinl;
+ csinh; csinhf; csinhl;
+ csqrt; csqrtf; csqrtl;
+ ctan; ctanf; ctanl;
+ ctanh; ctanhf; ctanhl;
+
+ # fp environment functions
+ feclearexcept; fegetenv; fegetexceptflag;
+ fegetround; feholdexcept; feraiseexcept;
+ fesetenv; fesetexceptflag; fesetround;
+ fetestexcept; feupdateenv;
+
# global variables
- _LIB_VERSION;
+ _LIB_VERSION; signgam;
# functions used in inline functions or macros
__fpclassify; __fpclassifyf; __fpclassifyl;
__signbit; __signbitf; __signbitl;
- __finite; __finitef; __fintitel;
+ __finite; __finitef; __finitel;
__log1p;
diff --git a/math/math.h b/math/math.h
index aa37f71f3c..2007509035 100644
--- a/math/math.h
+++ b/math/math.h
@@ -22,25 +22,25 @@
*/
#ifndef _MATH_H
-
#define _MATH_H 1
+
#include <features.h>
__BEGIN_DECLS
/* Get machine-dependent HUGE_VAL value (returned on overflow).
On all IEEE754 machines, this is +Infinity. */
-#include <huge_val.h>
+#include <bits/huge_val.h>
/* Get machine-dependent NAN value (returned for some domain errors). */
#ifdef __USE_GNU
-#include <nan.h>
+#include <bits/nan.h>
#endif
-/* The file <mathcalls.h> contains the prototypes for all the actual
- math functions. These macros are used for those prototypes, so
- we can easily declare each function as both `name' and `__name',
+/* The file <bits/mathcalls.h> contains the prototypes for all the
+ actual math functions. These macros are used for those prototypes,
+ so we can easily declare each function as both `name' and `__name',
and can declare the float versions `namef' and `__namef'. */
#define __MATHCALL(function,suffix, args) \
@@ -58,7 +58,7 @@ __BEGIN_DECLS
#define _Mdouble_ double
#define __MATH_PRECNAME(name,r) __CONCAT(name,r)
-#include <mathcalls.h>
+#include <bits/mathcalls.h>
#undef _Mdouble_
#undef __MATH_PRECNAME
@@ -77,7 +77,7 @@ __BEGIN_DECLS
#else
#define __MATH_PRECNAME(name,r) name/**/f/**/r
#endif
-#include <mathcalls.h>
+#include <bits/mathcalls.h>
#undef _Mdouble_
#undef __MATH_PRECNAME
@@ -94,7 +94,7 @@ __BEGIN_DECLS
#else
#define __MATH_PRECNAME(name,r) name/**/l/**/r
#endif
-#include <mathcalls.h>
+#include <bits/mathcalls.h>
#undef _Mdouble_
#undef __MATH_PRECNAME
@@ -132,7 +132,7 @@ extern int signgam;
INFINITY representation of the infinity value of type `float_t'
*/
-#include <mathbits.h>
+#include <bits/mathdef.h>
/* All floating-point numbers can be put in one of these categories. */
enum
@@ -318,7 +318,7 @@ extern int matherr __P ((struct exception *));
/* Get machine-dependent inline versions (if there are any). */
#if (!defined __NO_MATH_INLINES && defined __OPTIMIZE__) \
|| defined __LIBC_M81_MATH_INLINES
-#include <__math.h>
+#include <bits/mathinline.h>
#endif
diff --git a/math/math_private.h b/math/math_private.h
index a7a4f3d74e..74b729d419 100644
--- a/math/math_private.h
+++ b/math/math_private.h
@@ -269,7 +269,7 @@ extern double __ieee754_y1 __P((double));
extern double __ieee754_jn __P((int,double));
extern double __ieee754_yn __P((int,double));
extern double __ieee754_remainder __P((double,double));
-extern int __ieee754_rem_pio2 __P((double,double*));
+extern int32_t __ieee754_rem_pio2 __P((double,double*));
extern double __ieee754_scalb __P((double,double));
/* fdlibm kernel function */
@@ -277,7 +277,8 @@ extern double __kernel_standard __P((double,double,int));
extern double __kernel_sin __P((double,double,int));
extern double __kernel_cos __P((double,double));
extern double __kernel_tan __P((double,double,int));
-extern int __kernel_rem_pio2 __P((double*,double*,int,int,int,const int*));
+extern int __kernel_rem_pio2 __P((double*,double*,int,int,int,
+ const int32_t*));
/* ieee style elementary float functions */
@@ -306,14 +307,15 @@ extern float __ieee754_y1f __P((float));
extern float __ieee754_jnf __P((int,float));
extern float __ieee754_ynf __P((int,float));
extern float __ieee754_remainderf __P((float,float));
-extern int __ieee754_rem_pio2f __P((float,float*));
+extern int32_t __ieee754_rem_pio2f __P((float,float*));
extern float __ieee754_scalbf __P((float,float));
/* float versions of fdlibm kernel functions */
extern float __kernel_sinf __P((float,float,int));
extern float __kernel_cosf __P((float,float));
extern float __kernel_tanf __P((float,float,int));
-extern int __kernel_rem_pio2f __P((float*,float*,int,int,int,const int*));
+extern int __kernel_rem_pio2f __P((float*,float*,int,int,int,
+ const int32_t*));
/* ieee style elementary long double functions */