diff options
author | Christopher Faylor <me@cgf.cx> | 2000-02-17 19:39:52 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2000-02-17 19:39:52 +0000 |
commit | 8a0efa53e44919bcf5ccb1d3353618a82afdf8bc (patch) | |
tree | 68c3dbf3f2c6fd5d49777def9914d77b5cd4589d /newlib/libm/mathfp/sf_logarithm.c | |
parent | 1fd5e000ace55b323124c7e556a7a864b972a5c4 (diff) | |
download | cygnal-8a0efa53e44919bcf5ccb1d3353618a82afdf8bc.tar.gz cygnal-8a0efa53e44919bcf5ccb1d3353618a82afdf8bc.tar.bz2 cygnal-8a0efa53e44919bcf5ccb1d3353618a82afdf8bc.zip |
import newlib-2000-02-17 snapshot
Diffstat (limited to 'newlib/libm/mathfp/sf_logarithm.c')
-rw-r--r-- | newlib/libm/mathfp/sf_logarithm.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/newlib/libm/mathfp/sf_logarithm.c b/newlib/libm/mathfp/sf_logarithm.c new file mode 100644 index 000000000..224482f13 --- /dev/null +++ b/newlib/libm/mathfp/sf_logarithm.c @@ -0,0 +1,72 @@ + +/* @(#)z_logarithmf.c 1.0 98/08/13 */ +/****************************************************************** + * The following routines are coded directly from the algorithms + * and coefficients given in "Software Manual for the Elementary + * Functions" by William J. Cody, Jr. and William Waite, Prentice + * Hall, 1980. + ******************************************************************/ +/****************************************************************** + * Logarithm + * + * Input: + * x - floating point value + * ten - indicates base ten numbers + * + * Output: + * logarithm of x + * + * Description: + * This routine calculates logarithms. + * + *****************************************************************/ + +#include "fdlibm.h" +#include "zmath.h" + +static const float a[] = { -0.5527074855 }; +static const float b[] = { -0.6632718214e+1 }; +static const float C1 = 0.693145752; +static const float C2 = 1.428606820e-06; +static const float C3 = 0.4342944819; + +float +_DEFUN (logarithmf, (float, int), + float x _AND + int ten) +{ + int N; + float f, w, z; + + /* Check for domain error here. */ + if (x <= 0.0) + { + errno = ERANGE; + return (z_notanum_f.f); + } + + /* Get the exponent and mantissa where x = f * 2^N. */ + f = frexpf (x, &N); + + z = f - 0.5; + + if (f > __SQRT_HALF) + z = (z - 0.5) / (f * 0.5 + 0.5); + else + { + N--; + z /= (z * 0.5 + 0.5); + } + w = z * z; + + /* Use Newton's method with 4 terms. */ + z += z * w * (a[0]) / ((w + 1.0) * w + b[0]); + + if (N != 0) + z = (N * C2 + z) + N * C1; + + if (ten) + z *= C3; + + return (z); +} |