about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2014-03-28 20:53:32 +0000
committerJoseph Myers <joseph@codesourcery.com>2014-03-28 20:53:32 +0000
commit289e0779571a36a8f30ae0408b4902bb7f2ab92e (patch)
treeb958fb51b0657f12d0571e4d82c2069a2929570f
parent277ae3f186eb9158219aacf20199cdd02ad133e7 (diff)
downloadglibc-289e0779571a36a8f30ae0408b4902bb7f2ab92e.tar.gz
glibc-289e0779571a36a8f30ae0408b4902bb7f2ab92e.tar.xz
glibc-289e0779571a36a8f30ae0408b4902bb7f2ab92e.zip
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.
-rw-r--r--ChangeLog15
-rw-r--r--NEWS10
-rw-r--r--math/libm-test.inc4
-rw-r--r--math/s_clog10.c5
-rw-r--r--math/s_clog10f.c5
-rw-r--r--math/s_clog10l.c5
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  <joseph@codesourcery.com>
+
+	[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  <ppluzhnikov@google.com>
 
 	* 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);