diff options
author | Martin Storsjö <martin@martin.st> | 2019-07-25 00:13:13 +0300 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2019-08-20 18:15:16 +0200 |
commit | f7f296b46f2607814c326ea1ed9b3294eb746034 (patch) | |
tree | 0ae6b7b4d749819a261ead4e45cdb37308d5b85f | |
parent | 8dee6fe6a5e7dd31af9c83ec2fe31d0d13dfa44f (diff) | |
download | cygnal-f7f296b46f2607814c326ea1ed9b3294eb746034.tar.gz cygnal-f7f296b46f2607814c326ea1ed9b3294eb746034.tar.bz2 cygnal-f7f296b46f2607814c326ea1ed9b3294eb746034.zip |
Cygwin: math: Properly propagate input NANs in a few functions
While the C99 standard doesn't explicitly require this, the standard
says it is recommended (F.9.13).
Signed-off-by: Martin Storsjö <martin@martin.st>
-rw-r--r-- | winsup/cygwin/math/acosh.def.h | 7 | ||||
-rw-r--r-- | winsup/cygwin/math/erfl.c | 3 | ||||
-rw-r--r-- | winsup/cygwin/math/lgammal.c | 2 | ||||
-rw-r--r-- | winsup/cygwin/math/log.def.h | 4 | ||||
-rw-r--r-- | winsup/cygwin/math/pow.def.h | 10 | ||||
-rw-r--r-- | 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 |