From 412965ab98a7c06630e715f33228d3943e500440 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Thu, 25 Jul 2019 00:13:13 +0300 Subject: [PATCH] Cygwin: math: Properly propagate input NANs in a few functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit While the C99 standard doesn't explicitly require this, the standard says it is recommended (F.9.13). Signed-off-by: Martin Storsjö --- winsup/cygwin/math/acosh.def.h | 7 ++++++- winsup/cygwin/math/erfl.c | 3 +++ winsup/cygwin/math/lgammal.c | 2 +- winsup/cygwin/math/log.def.h | 4 ++-- winsup/cygwin/math/pow.def.h | 10 +++++++--- winsup/cygwin/math/tgammal.c | 2 +- 6 files changed, 20 insertions(+), 8 deletions(-) diff --git a/winsup/cygwin/math/acosh.def.h b/winsup/cygwin/math/acosh.def.h index 1fc5deb14..870be3646 100644 --- a/winsup/cygwin/math/acosh.def.h +++ b/winsup/cygwin/math/acosh.def.h @@ -50,7 +50,12 @@ __FLT_TYPE __FLT_ABI(acosh) (__FLT_TYPE x) { int x_class = fpclassify (x); - if (x_class == FP_NAN || x < __FLT_CST(1.0)) + if (x_class == FP_NAN) + { + errno = EDOM; + return x; + } + else if (x < __FLT_CST(1.0)) { errno = EDOM; return __FLT_NAN; diff --git a/winsup/cygwin/math/erfl.c b/winsup/cygwin/math/erfl.c index 3832fe9e0..bfd8d33d3 100644 --- a/winsup/cygwin/math/erfl.c +++ b/winsup/cygwin/math/erfl.c @@ -243,6 +243,9 @@ long double erfcl(long double a) if (isinf (a)) return (signbit(a) ? 2.0 : 0.0); + if (isnan (a)) + return (a); + x = fabsl (a); if (x < 1.0L) diff --git a/winsup/cygwin/math/lgammal.c b/winsup/cygwin/math/lgammal.c index 03c030e00..533ef7553 100644 --- a/winsup/cygwin/math/lgammal.c +++ b/winsup/cygwin/math/lgammal.c @@ -216,7 +216,7 @@ long double __lgammal_r(long double x, int* sgngaml) *sgngaml = 1; #ifdef NANS if (isnanl(x)) - return(NANL); + return x; #endif #ifdef INFINITIES if (!isfinitel(x)) diff --git a/winsup/cygwin/math/log.def.h b/winsup/cygwin/math/log.def.h index 2ba7421a2..b4121e929 100644 --- a/winsup/cygwin/math/log.def.h +++ b/winsup/cygwin/math/log.def.h @@ -56,6 +56,8 @@ __FLT_ABI(log) (__FLT_TYPE x) errno = ERANGE; return -__FLT_HUGE_VAL; } + else if (x_class == FP_NAN) + return x; else if (signbit (x)) { errno = EDOM; @@ -63,7 +65,5 @@ __FLT_ABI(log) (__FLT_TYPE x) } else if (x_class == FP_INFINITE) return __FLT_HUGE_VAL; - else if (x_class == FP_NAN) - return __FLT_NAN; return (__FLT_TYPE) __logl_internal ((long double) x); } diff --git a/winsup/cygwin/math/pow.def.h b/winsup/cygwin/math/pow.def.h index e1538d9fa..b004c0991 100644 --- a/winsup/cygwin/math/pow.def.h +++ b/winsup/cygwin/math/pow.def.h @@ -121,9 +121,13 @@ __FLT_ABI(pow) (__FLT_TYPE x, __FLT_TYPE y) return __FLT_CST(1.0); else if (x_class == FP_NAN || y_class == FP_NAN) { - rslt = (signbit(x) ? -__FLT_NAN : __FLT_NAN); - errno = EDOM; - return rslt; + if (x_class == FP_NAN) { + errno = EDOM; + return x; + } else { + errno = EDOM; + return y; + } } else if (x_class == FP_ZERO) { diff --git a/winsup/cygwin/math/tgammal.c b/winsup/cygwin/math/tgammal.c index 25a37eaeb..910706db6 100644 --- a/winsup/cygwin/math/tgammal.c +++ b/winsup/cygwin/math/tgammal.c @@ -272,7 +272,7 @@ long double __tgammal_r(long double x, int* sgngaml) *sgngaml = 1; #ifdef NANS if (isnanl(x)) - return (NANL); + return x; #endif #ifdef INFINITIES #ifdef NANS