mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-30 22:43:12 +03:00
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 <joseph@codesourcery.com> [BZ #15467] * sysdeps/ieee754/dbl-64/s_sincos.c: Include <errno.h>. (__sincos): Set errno to EDOM for infinite argument. * sysdeps/ieee754/flt-32/s_sincosf.c: Include <errno.h>. (SINCOSF_FUNC): Set errno to EDOM for infinite argument. * sysdeps/ieee754/ldbl-128/s_sincosl.c: Include <errno.h>. (__sincosl): Set errno to EDOM for infinite argument. * sysdeps/ieee754/ldbl-128ibm/s_sincosl.c: Include <errno.h>. (__sincosl): Set errno to EDOM for infinite argument. * sysdeps/ieee754/ldbl-96/s_sincosl.c: Include <errno.h>. (__sincosl): Set errno to EDOM for infinite argument. * math/libm-test.inc (sincos_test_data): Test errno setting.
This commit is contained in:
15
ChangeLog
15
ChangeLog
@ -1,3 +1,18 @@
|
|||||||
|
2015-02-11 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
|
[BZ #15467]
|
||||||
|
* sysdeps/ieee754/dbl-64/s_sincos.c: Include <errno.h>.
|
||||||
|
(__sincos): Set errno to EDOM for infinite argument.
|
||||||
|
* sysdeps/ieee754/flt-32/s_sincosf.c: Include <errno.h>.
|
||||||
|
(SINCOSF_FUNC): Set errno to EDOM for infinite argument.
|
||||||
|
* sysdeps/ieee754/ldbl-128/s_sincosl.c: Include <errno.h>.
|
||||||
|
(__sincosl): Set errno to EDOM for infinite argument.
|
||||||
|
* sysdeps/ieee754/ldbl-128ibm/s_sincosl.c: Include <errno.h>.
|
||||||
|
(__sincosl): Set errno to EDOM for infinite argument.
|
||||||
|
* sysdeps/ieee754/ldbl-96/s_sincosl.c: Include <errno.h>.
|
||||||
|
(__sincosl): Set errno to EDOM for infinite argument.
|
||||||
|
* math/libm-test.inc (sincos_test_data): Test errno setting.
|
||||||
|
|
||||||
2015-02-11 Leonhard Holz <leonhard.holz@web.de>
|
2015-02-11 Leonhard Holz <leonhard.holz@web.de>
|
||||||
|
|
||||||
* string/strxfrm_l.c: Remove #define STRCMP.
|
* string/strxfrm_l.c: Remove #define STRCMP.
|
||||||
|
2
NEWS
2
NEWS
@ -9,7 +9,7 @@ Version 2.22
|
|||||||
|
|
||||||
* The following bugs are resolved with this release:
|
* The following bugs are resolved with this release:
|
||||||
|
|
||||||
4719, 17912, 17932, 17944, 17949.
|
4719, 15467, 17912, 17932, 17944, 17949.
|
||||||
|
|
||||||
Version 2.21
|
Version 2.21
|
||||||
|
|
||||||
|
@ -9335,9 +9335,9 @@ sin_test (void)
|
|||||||
|
|
||||||
static const struct test_fFF_11_data sincos_test_data[] =
|
static const struct test_fFF_11_data sincos_test_data[] =
|
||||||
{
|
{
|
||||||
TEST_fFF_11 (sincos, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION),
|
TEST_fFF_11 (sincos, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
|
||||||
TEST_fFF_11 (sincos, minus_infty, qnan_value, qnan_value, INVALID_EXCEPTION),
|
TEST_fFF_11 (sincos, minus_infty, qnan_value, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
|
||||||
TEST_fFF_11 (sincos, qnan_value, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
|
TEST_fFF_11 (sincos, qnan_value, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
|
||||||
|
|
||||||
AUTO_TESTS_fFF_11 (sincos),
|
AUTO_TESTS_fFF_11 (sincos),
|
||||||
};
|
};
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include <math_private.h>
|
#include <math_private.h>
|
||||||
@ -36,6 +37,8 @@ __sincos (double x, double *sinx, double *cosx)
|
|||||||
{
|
{
|
||||||
/* sin(Inf or NaN) is NaN */
|
/* sin(Inf or NaN) is NaN */
|
||||||
*sinx = *cosx = x - x;
|
*sinx = *cosx = x - x;
|
||||||
|
if (__isinf_ns (x))
|
||||||
|
__set_errno (EDOM);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include <math_private.h>
|
#include <math_private.h>
|
||||||
@ -46,6 +47,8 @@ SINCOSF_FUNC (float x, float *sinx, float *cosx)
|
|||||||
{
|
{
|
||||||
/* sin(Inf or NaN) is NaN */
|
/* sin(Inf or NaN) is NaN */
|
||||||
*sinx = *cosx = x - x;
|
*sinx = *cosx = x - x;
|
||||||
|
if (ix == 0x7f800000)
|
||||||
|
__set_errno (EDOM);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include <math_private.h>
|
#include <math_private.h>
|
||||||
@ -38,6 +39,8 @@ __sincosl (long double x, long double *sinx, long double *cosx)
|
|||||||
{
|
{
|
||||||
/* sin(Inf or NaN) is NaN */
|
/* sin(Inf or NaN) is NaN */
|
||||||
*sinx = *cosx = x - x;
|
*sinx = *cosx = x - x;
|
||||||
|
if (__isinf_nsl (x))
|
||||||
|
__set_errno (EDOM);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include <math_private.h>
|
#include <math_private.h>
|
||||||
@ -41,6 +42,8 @@ __sincosl (long double x, long double *sinx, long double *cosx)
|
|||||||
{
|
{
|
||||||
/* sin(Inf or NaN) is NaN */
|
/* sin(Inf or NaN) is NaN */
|
||||||
*sinx = *cosx = x - x;
|
*sinx = *cosx = x - x;
|
||||||
|
if (__isinf_nsl (x))
|
||||||
|
__set_errno (EDOM);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include <math_private.h>
|
#include <math_private.h>
|
||||||
@ -41,6 +42,8 @@ __sincosl (long double x, long double *sinx, long double *cosx)
|
|||||||
{
|
{
|
||||||
/* sin(Inf or NaN) is NaN */
|
/* sin(Inf or NaN) is NaN */
|
||||||
*sinx = *cosx = x - x;
|
*sinx = *cosx = x - x;
|
||||||
|
if (__isinf_nsl (x))
|
||||||
|
__set_errno (EDOM);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user