From 70317d8506a653b643a52e741442f506f23b24e4 Mon Sep 17 00:00:00 2001 From: Jeff Johnston Date: Thu, 18 Oct 2007 00:03:32 +0000 Subject: [PATCH] 2007-10-17 Jeff Johnston * libm/mathfp/s_logarithm.c: Fix error introduced by previous fix when handling negative input values. Make function consistent with math directory and glibc version such that inf and nan values return inf and nan respectively with no errno setting. * libm/mathfp/sf_logarithm.c: Ditto. * libm/math/w_log.c: Set errno to ERANGE when input is 0.0. * libm/math/wf_log.c: Ditto. * libm/math/w_log10.c: Ditto. * libm/math/wf_log10.c: Ditto. --- newlib/ChangeLog | 13 +++++++++++++ newlib/libm/math/w_log.c | 2 +- newlib/libm/math/w_log10.c | 2 +- newlib/libm/math/wf_log.c | 2 +- newlib/libm/math/wf_log10.c | 2 +- newlib/libm/mathfp/s_logarithm.c | 16 ++++++++++++++-- newlib/libm/mathfp/sf_logarithm.c | 16 ++++++++++++++-- 7 files changed, 45 insertions(+), 8 deletions(-) diff --git a/newlib/ChangeLog b/newlib/ChangeLog index d964ff3be..6cc23b77c 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,16 @@ +2007-10-17 Jeff Johnston + + * libm/mathfp/s_logarithm.c: Fix error introduced by previous + fix when handling negative input values. Make function + consistent with math directory and glibc version such that + inf and nan values return inf and nan respectively with no + errno setting. + * libm/mathfp/sf_logarithm.c: Ditto. + * libm/math/w_log.c: Set errno to ERANGE when input is 0.0. + * libm/math/wf_log.c: Ditto. + * libm/math/w_log10.c: Ditto. + * libm/math/wf_log10.c: Ditto. + 2007-10-17 Jeff Johnston * libm/mathfp/s_logarithm.c: Fix case where input is 0 to diff --git a/newlib/libm/math/w_log.c b/newlib/libm/math/w_log.c index e23efd7e6..38896cd25 100644 --- a/newlib/libm/math/w_log.c +++ b/newlib/libm/math/w_log.c @@ -95,7 +95,7 @@ PORTABILITY if (_LIB_VERSION == _POSIX_) errno = ERANGE; else if (!matherr(&exc)) { - errno = EDOM; + errno = ERANGE; } } else { /* log(x<0) */ diff --git a/newlib/libm/math/w_log10.c b/newlib/libm/math/w_log10.c index 7c3966954..66f0e78d1 100644 --- a/newlib/libm/math/w_log10.c +++ b/newlib/libm/math/w_log10.c @@ -93,7 +93,7 @@ PORTABILITY if (_LIB_VERSION == _POSIX_) errno = ERANGE; else if (!matherr(&exc)) { - errno = EDOM; + errno = ERANGE; } } else { /* log10(x<0) */ diff --git a/newlib/libm/math/wf_log.c b/newlib/libm/math/wf_log.c index 369ef3261..989eeb335 100644 --- a/newlib/libm/math/wf_log.c +++ b/newlib/libm/math/wf_log.c @@ -53,7 +53,7 @@ if (_LIB_VERSION == _POSIX_) errno = ERANGE; else if (!matherr(&exc)) { - errno = EDOM; + errno = ERANGE; } } else { /* logf(x<0) */ diff --git a/newlib/libm/math/wf_log10.c b/newlib/libm/math/wf_log10.c index 728913500..41dd93a7b 100644 --- a/newlib/libm/math/wf_log10.c +++ b/newlib/libm/math/wf_log10.c @@ -54,7 +54,7 @@ if (_LIB_VERSION == _POSIX_) errno = ERANGE; else if (!matherr(&exc)) { - errno = EDOM; + errno = ERANGE; } } else { /* log10f(x<0) */ diff --git a/newlib/libm/mathfp/s_logarithm.c b/newlib/libm/mathfp/s_logarithm.c index 661dd8818..51e7f3066 100644 --- a/newlib/libm/mathfp/s_logarithm.c +++ b/newlib/libm/mathfp/s_logarithm.c @@ -100,12 +100,24 @@ _DEFUN (logarithm, (double, int), int N; double f, w, z; - /* Check for domain error here. */ - if (x <= 0.0) + /* Check for range and domain errors here. */ + if (x == 0.0) { errno = ERANGE; return (-z_infinity.d); } + else if (x < 0.0) + { + errno = EDOM; + return (z_notanum.d); + } + else if (!isfinite(x)) + { + if (isnan(x)) + return (z_notanum.d); + else + return (z_infinity.d); + } /* Get the exponent and mantissa where x = f * 2^N. */ f = frexp (x, &N); diff --git a/newlib/libm/mathfp/sf_logarithm.c b/newlib/libm/mathfp/sf_logarithm.c index b8564c14c..8aa85e880 100644 --- a/newlib/libm/mathfp/sf_logarithm.c +++ b/newlib/libm/mathfp/sf_logarithm.c @@ -38,12 +38,24 @@ _DEFUN (logarithmf, (float, int), int N; float f, w, z; - /* Check for domain error here. */ - if (x <= 0.0) + /* Check for domain/range errors here. */ + if (x == 0.0) { errno = ERANGE; return (-z_infinity_f.f); } + else if (x < 0.0) + { + errno = EDOM; + return (z_notanum_f.f); + } + else if (!isfinitef(x)) + { + if (isnanf(x)) + return (z_notanum_f.f); + else + return (z_infinity_f.f); + } /* Get the exponent and mantissa where x = f * 2^N. */ f = frexpf (x, &N);