mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-01-15 11:00:04 +08:00
70317d8506
* 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.
117 lines
2.4 KiB
C
117 lines
2.4 KiB
C
|
|
/* @(#)w_log10.c 5.1 93/09/24 */
|
|
/*
|
|
* ====================================================
|
|
* 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.
|
|
* ====================================================
|
|
*/
|
|
|
|
/*
|
|
FUNCTION
|
|
<<log10>>, <<log10f>>---base 10 logarithms
|
|
|
|
INDEX
|
|
log10
|
|
INDEX
|
|
log10f
|
|
|
|
ANSI_SYNOPSIS
|
|
#include <math.h>
|
|
double log10(double <[x]>);
|
|
float log10f(float <[x]>);
|
|
|
|
TRAD_SYNOPSIS
|
|
#include <math.h>
|
|
double log10(<[x]>)
|
|
double <[x]>;
|
|
|
|
float log10f(<[x]>)
|
|
float <[x]>;
|
|
|
|
DESCRIPTION
|
|
<<log10>> returns the base 10 logarithm of <[x]>.
|
|
It is implemented as <<log(<[x]>) / log(10)>>.
|
|
|
|
<<log10f>> is identical, save that it takes and returns <<float>> values.
|
|
|
|
RETURNS
|
|
<<log10>> and <<log10f>> return the calculated value.
|
|
|
|
See the description of <<log>> for information on errors.
|
|
|
|
PORTABILITY
|
|
<<log10>> is ANSI C. <<log10f>> is an extension.
|
|
|
|
*/
|
|
|
|
/*
|
|
* wrapper log10(X)
|
|
*/
|
|
|
|
#include "fdlibm.h"
|
|
#include <errno.h>
|
|
|
|
#ifndef _DOUBLE_IS_32BITS
|
|
|
|
#ifdef __STDC__
|
|
double log10(double x) /* wrapper log10 */
|
|
#else
|
|
double log10(x) /* wrapper log10 */
|
|
double x;
|
|
#endif
|
|
{
|
|
#ifdef _IEEE_LIBM
|
|
return __ieee754_log10(x);
|
|
#else
|
|
double z;
|
|
struct exception exc;
|
|
z = __ieee754_log10(x);
|
|
if(_LIB_VERSION == _IEEE_ || isnan(x)) return z;
|
|
if(x<=0.0) {
|
|
#ifndef HUGE_VAL
|
|
#define HUGE_VAL inf
|
|
double inf = 0.0;
|
|
|
|
SET_HIGH_WORD(inf,0x7ff00000); /* set inf to infinite */
|
|
#endif
|
|
exc.name = "log10";
|
|
exc.err = 0;
|
|
exc.arg1 = x;
|
|
exc.arg2 = x;
|
|
if (_LIB_VERSION == _SVID_)
|
|
exc.retval = -HUGE;
|
|
else
|
|
exc.retval = -HUGE_VAL;
|
|
if(x==0.0) {
|
|
/* log10(0) */
|
|
exc.type = SING;
|
|
if (_LIB_VERSION == _POSIX_)
|
|
errno = ERANGE;
|
|
else if (!matherr(&exc)) {
|
|
errno = ERANGE;
|
|
}
|
|
} else {
|
|
/* log10(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 exc.retval;
|
|
} else
|
|
return z;
|
|
#endif
|
|
}
|
|
|
|
#endif /* defined(_DOUBLE_IS_32BITS) */
|