diff options
Diffstat (limited to 'nuttx/lib/math/lib_log.c')
-rw-r--r-- | nuttx/lib/math/lib_log.c | 159 |
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 |