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);