From d435569cd626bccb9c27361202a279d0fd7fce88 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Wed, 11 Feb 2015 23:17:25 +0000 Subject: Fix sincos errno setting (bug 15467). This patch makes sincos set errno to EDOM when passed an infinity, similarly to sin and cos. Tested for x86_64, x86, powerpc and mips64. I don't know if the architecture-specific implementations for ia64 and m68k might need corresponding fixes. 2015-02-11 Joseph Myers [BZ #15467] * sysdeps/ieee754/dbl-64/s_sincos.c: Include . (__sincos): Set errno to EDOM for infinite argument. * sysdeps/ieee754/flt-32/s_sincosf.c: Include . (SINCOSF_FUNC): Set errno to EDOM for infinite argument. * sysdeps/ieee754/ldbl-128/s_sincosl.c: Include . (__sincosl): Set errno to EDOM for infinite argument. * sysdeps/ieee754/ldbl-128ibm/s_sincosl.c: Include . (__sincosl): Set errno to EDOM for infinite argument. * sysdeps/ieee754/ldbl-96/s_sincosl.c: Include . (__sincosl): Set errno to EDOM for infinite argument. * math/libm-test.inc (sincos_test_data): Test errno setting. --- sysdeps/ieee754/dbl-64/s_sincos.c | 3 +++ sysdeps/ieee754/flt-32/s_sincosf.c | 3 +++ sysdeps/ieee754/ldbl-128/s_sincosl.c | 3 +++ sysdeps/ieee754/ldbl-128ibm/s_sincosl.c | 3 +++ sysdeps/ieee754/ldbl-96/s_sincosl.c | 3 +++ 5 files changed, 15 insertions(+) (limited to 'sysdeps') diff --git a/sysdeps/ieee754/dbl-64/s_sincos.c b/sysdeps/ieee754/dbl-64/s_sincos.c index 7d3b10139f..c8a99991cc 100644 --- a/sysdeps/ieee754/dbl-64/s_sincos.c +++ b/sysdeps/ieee754/dbl-64/s_sincos.c @@ -17,6 +17,7 @@ License along with the GNU C Library; if not, see . */ +#include #include #include @@ -36,6 +37,8 @@ __sincos (double x, double *sinx, double *cosx) { /* sin(Inf or NaN) is NaN */ *sinx = *cosx = x - x; + if (__isinf_ns (x)) + __set_errno (EDOM); } else { diff --git a/sysdeps/ieee754/flt-32/s_sincosf.c b/sysdeps/ieee754/flt-32/s_sincosf.c index 5cf5db03cb..596e076609 100644 --- a/sysdeps/ieee754/flt-32/s_sincosf.c +++ b/sysdeps/ieee754/flt-32/s_sincosf.c @@ -17,6 +17,7 @@ License along with the GNU C Library; if not, see . */ +#include #include #include @@ -46,6 +47,8 @@ SINCOSF_FUNC (float x, float *sinx, float *cosx) { /* sin(Inf or NaN) is NaN */ *sinx = *cosx = x - x; + if (ix == 0x7f800000) + __set_errno (EDOM); } else { diff --git a/sysdeps/ieee754/ldbl-128/s_sincosl.c b/sysdeps/ieee754/ldbl-128/s_sincosl.c index 175a617d1a..6c4cbd7237 100644 --- a/sysdeps/ieee754/ldbl-128/s_sincosl.c +++ b/sysdeps/ieee754/ldbl-128/s_sincosl.c @@ -18,6 +18,7 @@ License along with the GNU C Library; if not, see . */ +#include #include #include @@ -38,6 +39,8 @@ __sincosl (long double x, long double *sinx, long double *cosx) { /* sin(Inf or NaN) is NaN */ *sinx = *cosx = x - x; + if (__isinf_nsl (x)) + __set_errno (EDOM); } else { diff --git a/sysdeps/ieee754/ldbl-128ibm/s_sincosl.c b/sysdeps/ieee754/ldbl-128ibm/s_sincosl.c index f52e73385d..8a49c54d6c 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_sincosl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_sincosl.c @@ -18,6 +18,7 @@ License along with the GNU C Library; if not, see . */ +#include #include #include @@ -41,6 +42,8 @@ __sincosl (long double x, long double *sinx, long double *cosx) { /* sin(Inf or NaN) is NaN */ *sinx = *cosx = x - x; + if (__isinf_nsl (x)) + __set_errno (EDOM); } else { diff --git a/sysdeps/ieee754/ldbl-96/s_sincosl.c b/sysdeps/ieee754/ldbl-96/s_sincosl.c index c7a161a770..37067bdaeb 100644 --- a/sysdeps/ieee754/ldbl-96/s_sincosl.c +++ b/sysdeps/ieee754/ldbl-96/s_sincosl.c @@ -17,6 +17,7 @@ License along with the GNU C Library; if not, see . */ +#include #include #include @@ -41,6 +42,8 @@ __sincosl (long double x, long double *sinx, long double *cosx) { /* sin(Inf or NaN) is NaN */ *sinx = *cosx = x - x; + if (__isinf_nsl (x)) + __set_errno (EDOM); } else { -- cgit 1.4.1