4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-01-18 20:39:33 +08:00
Jeff Johnston 70317d8506 2007-10-17 Jeff Johnston <jjohnstn@redhat.com>
* 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-18 00:03:32 +00:00

87 lines
1.8 KiB
C

/* wf_log.c -- float version of w_log.c.
* Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* wrapper logf(x)
*/
#include "fdlibm.h"
#include <errno.h>
#ifdef __STDC__
float logf(float x) /* wrapper logf */
#else
float logf(x) /* wrapper logf */
float x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_logf(x);
#else
float z;
struct exception exc;
z = __ieee754_logf(x);
if(_LIB_VERSION == _IEEE_ || isnanf(x) || x > (float)0.0) return z;
#ifndef HUGE_VAL
#define HUGE_VAL inf
double inf = 0.0;
SET_HIGH_WORD(inf,0x7ff00000); /* set inf to infinite */
#endif
exc.name = "logf";
exc.err = 0;
exc.arg1 = exc.arg2 = (double)x;
if (_LIB_VERSION == _SVID_)
exc.retval = -HUGE;
else
exc.retval = -HUGE_VAL;
if(x==(float)0.0) {
/* logf(0) */
exc.type = SING;
if (_LIB_VERSION == _POSIX_)
errno = ERANGE;
else if (!matherr(&exc)) {
errno = ERANGE;
}
} else {
/* logf(x<0) */
exc.type = DOMAIN;
if (_LIB_VERSION == _POSIX_)
errno = EDOM;
else if (!matherr(&exc)) {
errno = EDOM;
}
exc.retval = nan("");
}
if (exc.err != 0)
errno = exc.err;
return (float)exc.retval;
#endif
}
#ifdef _DOUBLE_IS_32BITS
#ifdef __STDC__
double log(double x)
#else
double log(x)
double x;
#endif
{
return (double) logf((float) x);
}
#endif /* defined(_DOUBLE_IS_32BITS) */