From 4d5940f0151241b73c6c0c1eb290462eb9c279b0 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Tue, 11 Oct 2016 00:50:43 +0000 Subject: [PATCH] Avoid M_NAN + M_NAN in complex functions. Some libm complex functions have code that computes M_NAN + M_NAN. This is nonsensical; it's just equivalent to M_NAN, since it's a quiet NaN (and the comments suggesting this raises an exception are similarly wrong). This patch changes the code just to use M_NAN (and removes the bogus comments). (Preferably, code should either propagate an input NaN or do a computation that raises "invalid" and generates a default NaN at the same time. There are various cases, however, that currently raise "invalid" even for NaN inputs; I think those are cases where "invalid" is optional in ISO C so a change to whether it's raised would be OK, but they would still need more careful consideration than the cases where such issues do not arise.) Tested for x86_64 and x86 (testsuite, and that installed stripped shared libraries are unchanged by the patch). * math/s_ccosh_template.c (M_DECL_FUNC (__ccosh)): Use M_NAN instead of M_NAN + M_NAN. * math/s_csinh_template.c (M_DECL_FUNC (__csinh)): Likewise. --- ChangeLog | 6 ++++++ math/s_ccosh_template.c | 5 ++--- math/s_csinh_template.c | 5 ++--- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2590895834..ee5f31568c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2016-10-11 Joseph Myers + + * math/s_ccosh_template.c (M_DECL_FUNC (__ccosh)): Use M_NAN + instead of M_NAN + M_NAN. + * math/s_csinh_template.c (M_DECL_FUNC (__csinh)): Likewise. + 2016-10-10 Samuel Thibault * misc/getauxval.c [!HAVE_AUX_VECTOR] (__getauxval): Do not define diff --git a/math/s_ccosh_template.c b/math/s_ccosh_template.c index 68de41d2da..7fea5c9f57 100644 --- a/math/s_ccosh_template.c +++ b/math/s_ccosh_template.c @@ -88,7 +88,7 @@ M_DECL_FUNC (__ccosh) (CFLOAT x) else { __imag__ retval = __real__ x == 0 ? 0 : M_NAN; - __real__ retval = M_NAN + M_NAN; + __real__ retval = M_NAN; if (icls == FP_INFINITE) feraiseexcept (FE_INVALID); @@ -124,9 +124,8 @@ M_DECL_FUNC (__ccosh) (CFLOAT x) } else { - /* The addition raises the invalid exception. */ __real__ retval = M_HUGE_VAL; - __imag__ retval = M_NAN + M_NAN; + __imag__ retval = M_NAN; if (icls == FP_INFINITE) feraiseexcept (FE_INVALID); diff --git a/math/s_csinh_template.c b/math/s_csinh_template.c index 22c0c315b0..45fbb36fd9 100644 --- a/math/s_csinh_template.c +++ b/math/s_csinh_template.c @@ -97,7 +97,7 @@ M_DECL_FUNC (__csinh) (CFLOAT x) { /* Real part is 0.0. */ __real__ retval = M_COPYSIGN (0, negate ? -1 : 1); - __imag__ retval = M_NAN + M_NAN; + __imag__ retval = M_NAN; if (icls == FP_INFINITE) feraiseexcept (FE_INVALID); @@ -143,9 +143,8 @@ M_DECL_FUNC (__csinh) (CFLOAT x) } else { - /* The addition raises the invalid exception. */ __real__ retval = M_HUGE_VAL; - __imag__ retval = M_NAN + M_NAN; + __imag__ retval = M_NAN; if (icls == FP_INFINITE) feraiseexcept (FE_INVALID); -- 2.11.4.GIT