summaryrefslogtreecommitdiff
path: root/nuttx/lib/math/lib_log.c
diff options
context:
space:
mode:
Diffstat (limited to 'nuttx/lib/math/lib_log.c')
-rw-r--r--nuttx/lib/math/lib_log.c159
1 files changed, 64 insertions, 95 deletions
diff --git a/nuttx/lib/math/lib_log.c b/nuttx/lib/math/lib_log.c
index 62af0368a..4dd51e87c 100644
--- a/nuttx/lib/math/lib_log.c
+++ b/nuttx/lib/math/lib_log.c
@@ -1,4 +1,14 @@
-/*
+/************************************************************************
+ * lib/math/lib_log.c
+ *
+ * This file is a part of NuttX:
+ *
+ * Copyright (C) 2012 Gregory Nutt. All rights reserved.
+ * Ported by: Darcy Gong
+ *
+ * It derives from the Rhombs OS math library by Nick Johnson which has
+ * a compatibile, MIT-style license:
+ *
* Copyright (C) 2009, 2010 Nick Johnson <nickbjohnson4224 at gmail.com>
*
* Permission to use, copy, modify, and distribute this software for any
@@ -12,102 +22,61 @@
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
+ *
+ ************************************************************************/
-#include <apps/math.h>
-#include <float.h>
-
-float logf(float x) {
- float y, y_old, ey, epsilon;
-
- y = 0.0;
- y_old = 1.0;
- epsilon = FLT_EPSILON;
-
- while (y > y_old + epsilon || y < y_old - epsilon) {
- y_old = y;
- ey = exp(y);
- y -= (ey - x) / ey;
-
- if (y > 700.0) {
- y = 700.0;
- }
- if (y < -700.0) {
- y = -700.0;
- }
-
- epsilon = (fabs(y) > 1.0) ? fabs(y) * FLT_EPSILON : FLT_EPSILON;
- }
-
- if (y == 700.0) {
- return INFINITY;
- }
- if (y == -700.0) {
- return INFINITY;
- }
-
- return y;
-}
-
-double log(double x) {
- double y, y_old, ey, epsilon;
-
- y = 0.0;
- y_old = 1.0;
- epsilon = DBL_EPSILON;
+/************************************************************************
+ * Included Files
+ ************************************************************************/
- while (y > y_old + epsilon || y < y_old - epsilon) {
- y_old = y;
- ey = exp(y);
- y -= (ey - x) / ey;
+#include <nuttx/config.h>
+#include <nuttx/compiler.h>
- if (y > 700.0) {
- y = 700.0;
- }
- if (y < -700.0) {
- y = -700.0;
- }
-
- epsilon = (fabs(y) > 1.0) ? fabs(y) * DBL_EPSILON : DBL_EPSILON;
- }
-
- if (y == 700.0) {
- return INFINITY;
- }
- if (y == -700.0) {
- return INFINITY;
- }
-
- return y;
-}
-
-long double logl(long double x) {
- long double y, y_old, ey, epsilon;
-
- y = 0.0;
- y_old = 1.0;
- epsilon = 1e-6; //fixme
-
- while (y > y_old + epsilon || y < y_old - epsilon) {
- y_old = y;
- ey = expl(y);
- y -= (ey - x) / ey;
-
- if (y > 700.0) {
- y = 700.0;
- }
- if (y < -700.0) {
- y = -700.0;
- }
- }
-
- if (y == 700.0) {
- return INFINITY;
- }
- if (y == -700.0) {
- return INFINITY;
- }
+#include <math.h>
+#include <float.h>
- return y;
+/************************************************************************
+ * Public Functions
+ ************************************************************************/
+
+#if CONFIG_HAVE_DOUBLE
+double log(double x)
+{
+ double y, y_old, ey, epsilon;
+
+ y = 0.0;
+ y_old = 1.0;
+ epsilon = DBL_EPSILON;
+
+ while (y > y_old + epsilon || y < y_old - epsilon)
+ {
+ y_old = y;
+ ey = exp(y);
+ y -= (ey - x) / ey;
+
+ if (y > 700.0)
+ {
+ y = 700.0;
+ }
+
+ if (y < -700.0)
+ {
+ y = -700.0;
+ }
+
+ epsilon = (fabs(y) > 1.0) ? fabs(y) * DBL_EPSILON : DBL_EPSILON;
+ }
+
+ if (y == 700.0)
+ {
+ return INFINITY;
+ }
+
+ if (y == -700.0)
+ {
+ return INFINITY;
+ }
+
+ return y;
}
-
+#endif