summaryrefslogtreecommitdiff
path: root/newlib/libm/mathfp/sf_logarithm.c
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libm/mathfp/sf_logarithm.c')
-rw-r--r--newlib/libm/mathfp/sf_logarithm.c72
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 00000000000..224482f133d
--- /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);
+}