From 289e0779571a36a8f30ae0408b4902bb7f2ab92e Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Fri, 28 Mar 2014 20:53:32 +0000 Subject: [PATCH] Fix clog10 (-0 +/- 0i) (bug 16362). This patch fixes the imaginary part of clog10 (-0 +/- 0i), which should be +/-pi / log(10) by analogy with clog (the functions were wrongly returning a result with imaginary part +/-pi, same as for clog, and the tests matched the incorrect result, though both functions and tests were correct for the similar case of clog10 (-inf +/- 0i)). Tested x86_64 and x86. [BZ #16362] * math/s_clog10.c (M_PI_LOG10E): New macro. (__clog10): Use M_PI_LOG10E instead of M_PI when real and imaginary parts are 0. * math/s_clog10f.c (M_PI_LOG10Ef): New macro. (__clog10f): Use M_PI_LOG10Ef instead of M_PI when real and imaginary parts are 0. * math/s_clog10l.c (M_PI_LOG10El): New macro. (__clog10l): Use M_PI_LOG10El instead of M_PIl when real and imaginary parts are 0. * math/libm-test.inc (clog10_test_data): Update expected results for when real and imaginary parts are 0. --- ChangeLog | 15 +++++++++++++++ NEWS | 10 +++++----- math/libm-test.inc | 4 ++-- math/s_clog10.c | 5 ++++- math/s_clog10f.c | 5 ++++- math/s_clog10l.c | 5 ++++- 6 files changed, 34 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index ac55c65ace..a3cd62bb82 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2014-03-28 Joseph Myers + + [BZ #16362] + * math/s_clog10.c (M_PI_LOG10E): New macro. + (__clog10): Use M_PI_LOG10E instead of M_PI when real and + imaginary parts are 0. + * math/s_clog10f.c (M_PI_LOG10Ef): New macro. + (__clog10f): Use M_PI_LOG10Ef instead of M_PI when real and + imaginary parts are 0. + * math/s_clog10l.c (M_PI_LOG10El): New macro. + (__clog10l): Use M_PI_LOG10El instead of M_PIl when real and + imaginary parts are 0. + * math/libm-test.inc (clog10_test_data): Update expected results + for when real and imaginary parts are 0. + 2014-03-27 Paul Pluzhnikov * elf/dl-load.c: Finish conversion of __builtin_expect into diff --git a/NEWS b/NEWS index a9cc5cb6ab..b34c9fc65e 100644 --- a/NEWS +++ b/NEWS @@ -9,11 +9,11 @@ Version 2.20 * The following bugs are resolved with this release: - 15347, 15804, 15894, 16002, 16198, 16284, 16348, 16357, 16447, 16532, - 16545, 16574, 16599, 16600, 16609, 16610, 16611, 16613, 16623, 16632, - 16634, 16639, 16642, 16649, 16670, 16674, 16677, 16680, 16683, 16689, - 16695, 16701, 16706, 16707, 16712, 16713, 16714, 16731, 16743, 16758, - 16759, 16760. + 15347, 15804, 15894, 16002, 16198, 16284, 16348, 16357, 16362, 16447, + 16532, 16545, 16574, 16599, 16600, 16609, 16610, 16611, 16613, 16623, + 16632, 16634, 16639, 16642, 16649, 16670, 16674, 16677, 16680, 16683, + 16689, 16695, 16701, 16706, 16707, 16712, 16713, 16714, 16731, 16743, + 16758, 16759, 16760. * Running the testsuite no longer terminates as soon as a test fails. Instead, a file tests.sum (xtests.sum from "make xcheck") is generated, diff --git a/math/libm-test.inc b/math/libm-test.inc index 9c4c2bfb75..cefcb9682a 100644 --- a/math/libm-test.inc +++ b/math/libm-test.inc @@ -6130,8 +6130,8 @@ clog_test (void) static const struct test_c_c_data clog10_test_data[] = { - TEST_c_c (clog10, minus_zero, 0, minus_infty, M_PIl, DIVIDE_BY_ZERO_EXCEPTION), - TEST_c_c (clog10, minus_zero, minus_zero, minus_infty, -M_PIl, DIVIDE_BY_ZERO_EXCEPTION), + TEST_c_c (clog10, minus_zero, 0, minus_infty, M_PI_LOG10El, DIVIDE_BY_ZERO_EXCEPTION), + TEST_c_c (clog10, minus_zero, minus_zero, minus_infty, -M_PI_LOG10El, DIVIDE_BY_ZERO_EXCEPTION), TEST_c_c (clog10, 0, 0, minus_infty, 0.0, DIVIDE_BY_ZERO_EXCEPTION), TEST_c_c (clog10, 0, minus_zero, minus_infty, minus_zero, DIVIDE_BY_ZERO_EXCEPTION), diff --git a/math/s_clog10.c b/math/s_clog10.c index 417d56186c..e75787949f 100644 --- a/math/s_clog10.c +++ b/math/s_clog10.c @@ -25,6 +25,9 @@ /* log_10 (2). */ #define M_LOG10_2 0.3010299956639811952137388947244930267682 +/* pi * log10 (e). */ +#define M_PI_LOG10E 1.364376353841841347485783625431355770210 + __complex__ double __clog10 (__complex__ double x) { @@ -35,7 +38,7 @@ __clog10 (__complex__ double x) if (__glibc_unlikely (rcls == FP_ZERO && icls == FP_ZERO)) { /* Real and imaginary part are 0.0. */ - __imag__ result = signbit (__real__ x) ? M_PI : 0.0; + __imag__ result = signbit (__real__ x) ? M_PI_LOG10E : 0.0; __imag__ result = __copysign (__imag__ result, __imag__ x); /* Yes, the following line raises an exception. */ __real__ result = -1.0 / fabs (__real__ x); diff --git a/math/s_clog10f.c b/math/s_clog10f.c index a9120e03f8..ca2cdf4f80 100644 --- a/math/s_clog10f.c +++ b/math/s_clog10f.c @@ -25,6 +25,9 @@ /* log_10 (2). */ #define M_LOG10_2f 0.3010299956639811952137388947244930267682f +/* pi * log10 (e). */ +#define M_PI_LOG10Ef 1.364376353841841347485783625431355770210f + __complex__ float __clog10f (__complex__ float x) { @@ -35,7 +38,7 @@ __clog10f (__complex__ float x) if (__glibc_unlikely (rcls == FP_ZERO && icls == FP_ZERO)) { /* Real and imaginary part are 0.0. */ - __imag__ result = signbit (__real__ x) ? M_PI : 0.0; + __imag__ result = signbit (__real__ x) ? M_PI_LOG10Ef : 0.0; __imag__ result = __copysignf (__imag__ result, __imag__ x); /* Yes, the following line raises an exception. */ __real__ result = -1.0 / fabsf (__real__ x); diff --git a/math/s_clog10l.c b/math/s_clog10l.c index ac33a8f140..cdb5d61014 100644 --- a/math/s_clog10l.c +++ b/math/s_clog10l.c @@ -32,6 +32,9 @@ /* log_10 (2). */ #define M_LOG10_2l 0.3010299956639811952137388947244930267682L +/* pi * log10 (e). */ +#define M_PI_LOG10El 1.364376353841841347485783625431355770210L + __complex__ long double __clog10l (__complex__ long double x) { @@ -42,7 +45,7 @@ __clog10l (__complex__ long double x) if (__glibc_unlikely (rcls == FP_ZERO && icls == FP_ZERO)) { /* Real and imaginary part are 0.0. */ - __imag__ result = signbit (__real__ x) ? M_PIl : 0.0; + __imag__ result = signbit (__real__ x) ? M_PI_LOG10El : 0.0; __imag__ result = __copysignl (__imag__ result, __imag__ x); /* Yes, the following line raises an exception. */ __real__ result = -1.0 / fabsl (__real__ x);