From af1b2fd08388a3beec3ee7eaa30646d9c002824e Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Thu, 29 Oct 2015 23:09:51 +0000 Subject: [PATCH] Fix ldbl-128 log1pl (-qNaN) spurious "invalid" exception (bug 19189). The ldbl-128 version of log1pl raises a spurious "invalid" exception for a -qNaN argument. This patch fixes this by making the initial check for infinities and NaNs handle arguments of both signs in such a way that NaNs result in a NaN being returned (quietly if the input NaN was quiet) while +Inf results in +Inf being returned and -Inf results in a qNaN being returned with "invalid" exception raised. Tested for mips64. [BZ #19189] * sysdeps/ieee754/ldbl-128/s_log1pl.c (__log1pl): Make check for non-finite argument handle arguments with negative sign. --- ChangeLog | 4 ++++ NEWS | 2 +- sysdeps/ieee754/ldbl-128/s_log1pl.c | 4 ++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 42c1701..3d3440f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2015-10-29 Joseph Myers + [BZ #19189] + * sysdeps/ieee754/ldbl-128/s_log1pl.c (__log1pl): Make check for + non-finite argument handle arguments with negative sign. + * math/libm-test.inc (j0_test_data): Do not test sign of zero result from infinite argument. (j1_test_data): Likewise. diff --git a/NEWS b/NEWS index ae89162..654217c 100644 --- a/NEWS +++ b/NEWS @@ -21,7 +21,7 @@ Version 2.23 18966, 18967, 18969, 18970, 18977, 18980, 18981, 18982, 18985, 19003, 19007, 19012, 19016, 19018, 19032, 19046, 19048, 19049, 19050, 19059, 19071, 19074, 19076, 19077, 19078, 19079, 19085, 19086, 19088, 19094, - 19095, 19124, 19125, 19129, 19134, 19137, 19156, 19174, 19181. + 19095, 19124, 19125, 19129, 19134, 19137, 19156, 19174, 19181, 19189. * A defect in the malloc implementation, present since glibc 2.15 (2012) or glibc 2.10 via --enable-experimental-malloc (2009), could result in the diff --git a/sysdeps/ieee754/ldbl-128/s_log1pl.c b/sysdeps/ieee754/ldbl-128/s_log1pl.c index 9806ab6..b348f41 100644 --- a/sysdeps/ieee754/ldbl-128/s_log1pl.c +++ b/sysdeps/ieee754/ldbl-128/s_log1pl.c @@ -130,8 +130,8 @@ __log1pl (long double xm1) /* Test for NaN or infinity input. */ u.value = xm1; hx = u.parts32.w0; - if (hx >= 0x7fff0000) - return xm1; + if ((hx & 0x7fffffff) >= 0x7fff0000) + return xm1 + fabsl (xm1); /* log1p(+- 0) = +- 0. */ if (((hx & 0x7fffffff) == 0) -- 2.7.4