Mercurial > hg > octave-lojdl
changeset 7638:2df457529cfa
implement expm1 and log1p functions
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Tue, 25 Mar 2008 19:47:21 -0400 |
parents | 2be056f03720 |
children | b2fbb393a072 |
files | ChangeLog configure.in doc/interpreter/arith.txi doc/interpreter/func.txi doc/interpreter/linalg.txi doc/interpreter/numbers.txi liboctave/ChangeLog liboctave/lo-specfun.cc liboctave/lo-specfun.h src/ChangeLog src/mappers.cc src/ov-base.cc src/ov-base.h src/ov-bool-mat.h src/ov-bool-sparse.h src/ov-bool.h src/ov-complex.cc src/ov-complex.h src/ov-cx-mat.cc src/ov-cx-mat.h src/ov-cx-sparse.cc src/ov-cx-sparse.h src/ov-range.h src/ov-re-mat.cc src/ov-re-mat.h src/ov-re-sparse.cc src/ov-re-sparse.h src/ov-scalar.cc src/ov-scalar.h src/ov.h |
diffstat | 30 files changed, 223 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2008-03-25 Jaroslav Hajek <highegg@gmail.com> + + * configure.in: Check for expm1 and log1p functions. + 2008-03-25 John W. Eaton <jwe@octave.org> * configure.in: Check for trunc.
--- a/configure.in +++ b/configure.in @@ -1313,15 +1313,16 @@ ### Checks for functions and variables. -AC_CHECK_FUNCS(atexit basename bcopy bzero canonicalize_file_name chmod \ - dup2 endgrent endpwent execvp fcntl fork getcwd getegid geteuid \ - getgid getgrent getgrgid getgrnam getpgrp getpid getppid getpwent \ - getpwuid gettimeofday getuid getwd _kbhit kill lgamma lgamma_r link \ - localtime_r lstat memmove mkdir mkfifo mkstemp on_exit pipe poll putenv \ - raise readlink realpath rename resolvepath rindex rmdir round select \ - setgrent setlocale setpwent setvbuf sigaction siglongjmp sigpending \ - sigprocmask sigsuspend snprintf stat strcasecmp strdup strerror stricmp \ - strncasecmp strnicmp strptime strsignal symlink tempnam tgamma trunc umask \ +AC_CHECK_FUNCS(atexit basename bcopy bzero canonicalize_file_name \ + chmod dup2 endgrent endpwent execvp expm1 fcntl fork getcwd \ + getegid geteuid getgid getgrent getgrgid getgrnam getpgrp getpid \ + getppid getpwent getpwuid gettimeofday getuid getwd _kbhit kill \ + lgamma lgamma_r link localtime_r log1p lstat memmove mkdir mkfifo \ + mkstemp on_exit pipe poll putenv raise readlink realpath rename \ + resolvepath rindex rmdir round select setgrent setlocale setpwent \ + setvbuf sigaction siglongjmp sigpending sigprocmask sigsuspend \ + snprintf stat strcasecmp strdup strerror stricmp strncasecmp \ + strnicmp strptime strsignal symlink tempnam tgamma trunc umask \ uname unlink usleep utime vfprintf vsprintf vsnprintf waitpid \ _chmod _snprintf x_utime _utime32)
--- a/doc/interpreter/arith.txi +++ b/doc/interpreter/arith.txi @@ -48,6 +48,8 @@ @DOCSTRING(exp) +@DOCSTRING(expm1) + @DOCSTRING(factor) @DOCSTRING(factorial) @@ -62,10 +64,14 @@ @DOCSTRING(gradient) +@DOCSTRING(hypot) + @DOCSTRING(lcm) @DOCSTRING(log) +@DOCSTRING(log1p) + @DOCSTRING(log10) @DOCSTRING(log2) @@ -88,6 +94,8 @@ @DOCSTRING(round) +@DOCSTRING(roundb) + @DOCSTRING(sign) @DOCSTRING(sqrt)
--- a/doc/interpreter/func.txi +++ b/doc/interpreter/func.txi @@ -664,6 +664,8 @@ @DOCSTRING(file_in_loadpath) +@DOCSTRING(restoredefaultpath) + @node Subfunctions @subsection Subfunctions
--- a/doc/interpreter/linalg.txi +++ b/doc/interpreter/linalg.txi @@ -122,12 +122,20 @@ @DOCSTRING(chol2inv) +@DOCSTRING(cholupdate) + @DOCSTRING(hess) @DOCSTRING(lu) @DOCSTRING(qr) +@DOCSTRING(qrupdate) + +@DOCSTRING(qrinsert) + +@DOCSTRING(qrdelete) + @DOCSTRING(qz) @DOCSTRING(qzhess)
--- a/doc/interpreter/numbers.txi +++ b/doc/interpreter/numbers.txi @@ -633,6 +633,8 @@ @DOCSTRING(isreal) +@DOCSTRING(isfloat) + @DOCSTRING(iscomplex) @DOCSTRING(ismatrix)
--- a/liboctave/ChangeLog +++ b/liboctave/ChangeLog @@ -13,6 +13,9 @@ 2008-03-25 Jaroslav Hajek <highegg@gmail.com> + * lo-specfun.cc (expm1, log1p): New functions. + * lo-specfun.h: Provide decls. + * lo-mappers.cc (xroundb): New function. * lo-mappers.h: Provide decl.
--- a/liboctave/lo-specfun.cc +++ b/liboctave/lo-specfun.cc @@ -224,6 +224,104 @@ return result; } +#if !defined (HAVE_EXPM1) +double +expm1 (double x) +{ + double retval; + + double ax = fabs (x); + + if (ax < 0.1) + { + ax /= 16; + + // use Taylor series to calculate exp(x)-1. + double t = ax; + double s = 0; + for (int i = 2; i < 7; i++) + s += (t *= ax/i); + s += ax; + + // use the identity (a+1)^2-1 = a*(a+2) + double e = s; + for (int i = 0; i < 4; i++) + { + s *= e + 2; + e *= e + 2; + } + + retval = (x > 0) ? s : -s / (1+s); + } + else + retval = exp (x) - 1; + + return retval; +} +#endif + +Complex +expm1(const Complex& x) +{ + Complex retval; + + if (std:: abs (x) < 1) + { + double im = x.imag(); + double u = expm1 (x.real ()); + double v = sin (im/2); + v = -2*v*v; + retval = Complex (u*v + u + v, (u+1) * sin (im)); + } + else + retval = std::exp (x) - Complex (1); + + return retval; +} + +#if !defined (HAVE_LOG1P) +double +log1p (double x) +{ + double retval; + + double ax = fabs (x); + + if (ax < 0.2) + { + // use approximation log (1+x) ~ 2*sum ((x/(2+x)).^ii ./ ii), ii = 1:2:2n+1 + double u = x / (2 + x), t = 1, s = 0; + for (int i = 2; i < 12; i += 2) + s += (t *= u*u) / (i+1); + + retval = 2 * (s + 1) * u; + } + else + retval = log (1 + x); + + return retval; +} +#endif + +Complex +log1p (const Complex& x) +{ + Complex retval; + + double r = x.real (), i = x.imag(); + + if (fabs (r) < 0.5 && fabs (i) < 0.5) + { + double u = 2*r + r*r + i*i; + retval = Complex (log1p (u / (1+sqrt (u+1))), + atan2 (1 + r, i)); + } + else + retval = std::log (Complex(1) + x); + + return retval; +} + static inline Complex zbesj (const Complex& z, double alpha, int kode, octave_idx_type& ierr);
--- a/liboctave/lo-specfun.h +++ b/liboctave/lo-specfun.h @@ -57,6 +57,16 @@ extern OCTAVE_API double erfc (double); #endif +#if !defined (HAVE_EXPM1) +extern OCTAVE_API double expm1 (double x); +#endif +extern OCTAVE_API Complex expm1 (const Complex& x); + +#if !defined (HAVE_LOG1P) +extern OCTAVE_API double log1p (double x); +#endif +extern OCTAVE_API Complex log1p (const Complex& x); + extern OCTAVE_API double xgamma (double x); extern OCTAVE_API double xlgamma (double x); extern OCTAVE_API Complex xlgamma (const Complex& x);
--- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,6 +1,14 @@ 2008-03-25 Jaroslav Hajek <highegg@gmail.com> - * mappers.cc (Froundb): New function. + * mappers.cc (Fexpm1, Flog1p): New functions. + * ov-base.cc, ov-base.h, ov-bool-mat.h, ov-bool-sparse.h, + ov-bool.h, ov-complex.cc, ov-complex.h, ov-cx-mat.cc, ov-cx-mat.h, + ov-cx-sparse.cc, ov-cx-sparse.h, ov-range.h, ov-re-mat.cc, + ov-re-mat.h, ov-re-sparse.cc, ov-re-sparse.h, ov-scalar.cc, + ov-scalar.h, ov.h: + Provide expm1 and log1p functions. + + * mappers.cc (Froundb): New functions * ov-base.cc, ov-base.h, ov-bool-mat.h, ov-bool-sparse.h, ov-bool.h, ov-complex.cc, ov-complex.h, ov-cx-mat.cc, ov-cx-mat.h, ov-cx-sparse.cc, ov-cx-sparse.h, ov-intx.h, ov-range.h, @@ -735,7 +743,7 @@ * Makefile.in (DLD_XSRC): Remove sort.cc * DLD-FUNCTIONS/sort.cc: Remove - * data.cc (Fdata): New function using octave_value sort methods + * data.cc (Fsort): New function using octave_value sort methods for the sorting. Add tests. 2008-01-30 Thomas Weber <thomas.weber.mail@gmail.com>
--- a/src/mappers.cc +++ b/src/mappers.cc @@ -363,6 +363,21 @@ return retval; } +DEFUN (expm1, args, , + "-*- texinfo -*-\n\ +@deftypefn {Mapping Function} {} expm1 (@var{x})\n\ +Compute exp (@var{x}) - 1 accurately in neighbourhood of zero.\n\ +@end deftypefn") +{ + octave_value retval; + if (args.length () == 1) + retval = args(0).expm1 (); + else + print_usage (); + + return retval; +} + DEFUN (finite, args, , "-*- texinfo -*-\n\ @deftypefn {Mapping Function} {} finite (@var{x})\n\ @@ -771,6 +786,21 @@ return retval; } +DEFUN (log1p, args, , + "-*- texinfo -*-\n\ +@deftypefn {Mapping Function} {} log1p (@var{x})\n\ +Compute log (1 + @var{x}) accurately in neighbourhood of zero.\n\ +@end deftypefn") +{ + octave_value retval; + if (args.length () == 1) + retval = args(0).log1p (); + else + print_usage (); + + return retval; +} + DEFUN (real, args, , "-*- texinfo -*-\n\ @deftypefn {Mapping Function} {} real (@var{z})\n\
--- a/src/ov-base.cc +++ b/src/ov-base.cc @@ -927,6 +927,7 @@ UNDEFINED_MAPPER (erf) UNDEFINED_MAPPER (erfc) UNDEFINED_MAPPER (exp) +UNDEFINED_MAPPER (expm1) UNDEFINED_MAPPER (finite) UNDEFINED_MAPPER (fix) UNDEFINED_MAPPER (floor) @@ -938,6 +939,7 @@ UNDEFINED_MAPPER (lgamma) UNDEFINED_MAPPER (log) UNDEFINED_MAPPER (log10) +UNDEFINED_MAPPER (log1p) UNDEFINED_MAPPER (real) UNDEFINED_MAPPER (round) UNDEFINED_MAPPER (roundb)
--- a/src/ov-base.h +++ b/src/ov-base.h @@ -488,6 +488,7 @@ virtual octave_value erf (void) const; virtual octave_value erfc (void) const; virtual octave_value exp (void) const; + virtual octave_value expm1 (void) const; virtual octave_value finite (void) const; virtual octave_value fix (void) const; virtual octave_value floor (void) const; @@ -499,6 +500,7 @@ virtual octave_value lgamma (void) const; virtual octave_value log (void) const; virtual octave_value log10 (void) const; + virtual octave_value log1p (void) const; virtual octave_value real (void) const; virtual octave_value round (void) const; virtual octave_value roundb (void) const;
--- a/src/ov-bool-mat.h +++ b/src/ov-bool-mat.h @@ -208,6 +208,7 @@ BOOL_MAT_MAPPER (erf) BOOL_MAT_MAPPER (erfc) BOOL_MAT_MAPPER (exp) + BOOL_MAT_MAPPER (expm1) BOOL_MAT_MAPPER (finite) BOOL_MAT_MAPPER (fix) BOOL_MAT_MAPPER (floor) @@ -219,6 +220,7 @@ BOOL_MAT_MAPPER (lgamma) BOOL_MAT_MAPPER (log) BOOL_MAT_MAPPER (log10) + BOOL_MAT_MAPPER (log1p) BOOL_MAT_MAPPER (real) BOOL_MAT_MAPPER (round) BOOL_MAT_MAPPER (roundb)
--- a/src/ov-bool-sparse.h +++ b/src/ov-bool-sparse.h @@ -164,6 +164,7 @@ BOOL_SPARSE_MAPPER (erf) BOOL_SPARSE_MAPPER (erfc) BOOL_SPARSE_MAPPER (exp) + BOOL_SPARSE_MAPPER (expm1) BOOL_SPARSE_MAPPER (finite) BOOL_SPARSE_MAPPER (fix) BOOL_SPARSE_MAPPER (floor) @@ -175,6 +176,7 @@ BOOL_SPARSE_MAPPER (lgamma) BOOL_SPARSE_MAPPER (log) BOOL_SPARSE_MAPPER (log10) + BOOL_SPARSE_MAPPER (log1p) BOOL_SPARSE_MAPPER (real) BOOL_SPARSE_MAPPER (round) BOOL_SPARSE_MAPPER (roundb)
--- a/src/ov-bool.h +++ b/src/ov-bool.h @@ -216,6 +216,7 @@ BOOL_MAPPER (erf) BOOL_MAPPER (erfc) BOOL_MAPPER (exp) + BOOL_MAPPER (expm1) BOOL_MAPPER (finite) BOOL_MAPPER (fix) BOOL_MAPPER (floor) @@ -227,6 +228,7 @@ BOOL_MAPPER (lgamma) BOOL_MAPPER (log) BOOL_MAPPER (log10) + BOOL_MAPPER (log1p) BOOL_MAPPER (real) BOOL_MAPPER (round) BOOL_MAPPER (roundb)
--- a/src/ov-complex.cc +++ b/src/ov-complex.cc @@ -372,11 +372,13 @@ COMPLEX_MAPPER (cos, std::cos) COMPLEX_MAPPER (cosh, std::cosh) COMPLEX_MAPPER (exp, std::exp) +COMPLEX_MAPPER (expm1, ::expm1) COMPLEX_MAPPER (fix, ::fix) COMPLEX_MAPPER (floor, ::floor) COMPLEX_MAPPER (imag, ximag) COMPLEX_MAPPER (log, std::log) COMPLEX_MAPPER (log10, std::log10) +COMPLEX_MAPPER (log1p, ::log1p) COMPLEX_MAPPER (real, xreal) COMPLEX_MAPPER (round, xround) COMPLEX_MAPPER (roundb, xroundb)
--- a/src/ov-complex.h +++ b/src/ov-complex.h @@ -164,11 +164,13 @@ octave_value cos (void) const; octave_value cosh (void) const; octave_value exp (void) const; + octave_value expm1 (void) const; octave_value fix (void) const; octave_value floor (void) const; octave_value imag (void) const; octave_value log (void) const; octave_value log10 (void) const; + octave_value log1p (void) const; octave_value real (void) const; octave_value round (void) const; octave_value roundb (void) const;
--- a/src/ov-cx-mat.cc +++ b/src/ov-cx-mat.cc @@ -692,11 +692,13 @@ ARRAY_MAPPER (cos, ComplexNDArray::cmapper, std::cos) ARRAY_MAPPER (cosh, ComplexNDArray::cmapper, std::cosh) ARRAY_MAPPER (exp, ComplexNDArray::cmapper, std::exp) +ARRAY_MAPPER (expm1, ComplexNDArray::cmapper, ::expm1) ARRAY_MAPPER (fix, ComplexNDArray::cmapper, ::fix) ARRAY_MAPPER (floor, ComplexNDArray::cmapper, ::floor) ARRAY_MAPPER (imag, ComplexNDArray::dmapper, ximag) ARRAY_MAPPER (log, ComplexNDArray::cmapper, std::log) ARRAY_MAPPER (log10, ComplexNDArray::cmapper, std::log10) +ARRAY_MAPPER (log1p, ComplexNDArray::cmapper, ::log1p) ARRAY_MAPPER (real, ComplexNDArray::dmapper, xreal) ARRAY_MAPPER (round, ComplexNDArray::cmapper, xround) ARRAY_MAPPER (roundb, ComplexNDArray::cmapper, xroundb)
--- a/src/ov-cx-mat.h +++ b/src/ov-cx-mat.h @@ -167,11 +167,13 @@ octave_value cos (void) const; octave_value cosh (void) const; octave_value exp (void) const; + octave_value expm1 (void) const; octave_value fix (void) const; octave_value floor (void) const; octave_value imag (void) const; octave_value log (void) const; octave_value log10 (void) const; + octave_value log1p (void) const; octave_value real (void) const; octave_value round (void) const; octave_value roundb (void) const;
--- a/src/ov-cx-sparse.cc +++ b/src/ov-cx-sparse.cc @@ -861,11 +861,13 @@ SPARSE_MAPPER (cos, SparseComplexMatrix::cmapper, std::cos) SPARSE_MAPPER (cosh, SparseComplexMatrix::cmapper, std::cosh) SPARSE_MAPPER (exp, SparseComplexMatrix::cmapper, std::exp) +SPARSE_MAPPER (expm1, SparseComplexMatrix::cmapper, ::expm1) SPARSE_MAPPER (fix, SparseComplexMatrix::cmapper, ::fix) SPARSE_MAPPER (floor, SparseComplexMatrix::cmapper, ::floor) SPARSE_MAPPER (imag, SparseComplexMatrix::dmapper, ximag) SPARSE_MAPPER (log, SparseComplexMatrix::cmapper, std::log) SPARSE_MAPPER (log10, SparseComplexMatrix::cmapper, std::log10) +SPARSE_MAPPER (log1p, SparseComplexMatrix::cmapper, ::log1p) SPARSE_MAPPER (real, SparseComplexMatrix::dmapper, xreal) SPARSE_MAPPER (round, SparseComplexMatrix::cmapper, xround) SPARSE_MAPPER (roundb, SparseComplexMatrix::cmapper, xroundb)
--- a/src/ov-cx-sparse.h +++ b/src/ov-cx-sparse.h @@ -166,11 +166,13 @@ octave_value cos (void) const; octave_value cosh (void) const; octave_value exp (void) const; + octave_value expm1 (void) const; octave_value fix (void) const; octave_value floor (void) const; octave_value imag (void) const; octave_value log (void) const; octave_value log10 (void) const; + octave_value log1p (void) const; octave_value real (void) const; octave_value round (void) const; octave_value roundb (void) const;
--- a/src/ov-range.h +++ b/src/ov-range.h @@ -291,6 +291,7 @@ RANGE_MAPPER (erf) RANGE_MAPPER (erfc) RANGE_MAPPER (exp) + RANGE_MAPPER (expm1) RANGE_MAPPER (finite) RANGE_MAPPER (fix) RANGE_MAPPER (floor) @@ -302,6 +303,7 @@ RANGE_MAPPER (lgamma) RANGE_MAPPER (log) RANGE_MAPPER (log10) + RANGE_MAPPER (log1p) RANGE_MAPPER (real) RANGE_MAPPER (round) RANGE_MAPPER (roundb)
--- a/src/ov-re-mat.cc +++ b/src/ov-re-mat.cc @@ -730,11 +730,13 @@ ARRAY_MAPPER (cos, NDArray::dmapper, ::cos) ARRAY_MAPPER (cosh, NDArray::dmapper, ::cosh) ARRAY_MAPPER (exp, NDArray::dmapper, ::exp) +ARRAY_MAPPER (expm1, NDArray::dmapper, ::expm1) ARRAY_MAPPER (fix, NDArray::dmapper, ::fix) ARRAY_MAPPER (floor, NDArray::dmapper, ::floor) ARRAY_MAPPER (imag, NDArray::dmapper, ::imag) CD_ARRAY_MAPPER (log, ::log, std::log, 0.0, octave_Inf) CD_ARRAY_MAPPER (log10, ::log10, std::log10, 0.0, octave_Inf) +CD_ARRAY_MAPPER (log1p, ::log1p, ::log1p, -1.0, octave_Inf) ARRAY_MAPPER (real, NDArray::dmapper, ::real) ARRAY_MAPPER (round, NDArray::dmapper, xround) ARRAY_MAPPER (roundb, NDArray::dmapper, xroundb)
--- a/src/ov-re-mat.h +++ b/src/ov-re-mat.h @@ -198,11 +198,13 @@ octave_value cos (void) const; octave_value cosh (void) const; octave_value exp (void) const; + octave_value expm1 (void) const; octave_value fix (void) const; octave_value floor (void) const; octave_value imag (void) const; octave_value log (void) const; octave_value log10 (void) const; + octave_value log1p (void) const; octave_value real (void) const; octave_value round (void) const; octave_value roundb (void) const;
--- a/src/ov-re-sparse.cc +++ b/src/ov-re-sparse.cc @@ -920,11 +920,13 @@ SPARSE_MAPPER (cos, SparseMatrix::dmapper, ::cos) SPARSE_MAPPER (cosh, SparseMatrix::dmapper, ::cosh) SPARSE_MAPPER (exp, SparseMatrix::dmapper, ::exp) +SPARSE_MAPPER (expm1, SparseMatrix::dmapper, ::expm1) SPARSE_MAPPER (fix, SparseMatrix::dmapper, ::fix) SPARSE_MAPPER (floor, SparseMatrix::dmapper, ::floor) SPARSE_MAPPER (imag, SparseMatrix::dmapper, ::imag) CD_SPARSE_MAPPER (log, ::log, std::log, 0.0, octave_Inf) CD_SPARSE_MAPPER (log10, ::log10, std::log10, 0.0, octave_Inf) +CD_SPARSE_MAPPER (log1p, ::log1p, ::log1p, 0.0, octave_Inf) SPARSE_MAPPER (real, SparseMatrix::dmapper, ::real) SPARSE_MAPPER (round, SparseMatrix::dmapper, xround) SPARSE_MAPPER (roundb, SparseMatrix::dmapper, xroundb)
--- a/src/ov-re-sparse.h +++ b/src/ov-re-sparse.h @@ -171,11 +171,13 @@ octave_value cos (void) const; octave_value cosh (void) const; octave_value exp (void) const; + octave_value expm1 (void) const; octave_value fix (void) const; octave_value floor (void) const; octave_value imag (void) const; octave_value log (void) const; octave_value log10 (void) const; + octave_value log1p (void) const; octave_value real (void) const; octave_value round (void) const; octave_value roundb (void) const;
--- a/src/ov-scalar.cc +++ b/src/ov-scalar.cc @@ -325,11 +325,13 @@ SCALAR_MAPPER (cos, ::cos) SCALAR_MAPPER (cosh, ::cosh) SCALAR_MAPPER (exp, ::exp) +SCALAR_MAPPER (expm1, ::expm1) SCALAR_MAPPER (fix, ::fix) SCALAR_MAPPER (floor, ::floor) SCALAR_MAPPER (imag, ::imag) CD_SCALAR_MAPPER (log, ::log, std::log, 0.0, octave_Inf) CD_SCALAR_MAPPER (log10, ::log10, std::log10, 0.0, octave_Inf) +CD_SCALAR_MAPPER (log1p, ::log1p, ::log1p, -1.0, octave_Inf) SCALAR_MAPPER (real, ::real) SCALAR_MAPPER (round, xround) SCALAR_MAPPER (roundb, xroundb)
--- a/src/ov-scalar.h +++ b/src/ov-scalar.h @@ -239,11 +239,13 @@ octave_value cos (void) const; octave_value cosh (void) const; octave_value exp (void) const; + octave_value expm1 (void) const; octave_value fix (void) const; octave_value floor (void) const; octave_value imag (void) const; octave_value log (void) const; octave_value log10 (void) const; + octave_value log1p (void) const; octave_value real (void) const; octave_value round (void) const; octave_value roundb (void) const;
--- a/src/ov.h +++ b/src/ov.h @@ -902,6 +902,7 @@ MAPPER_FORWARD (erf) MAPPER_FORWARD (erfc) MAPPER_FORWARD (exp) + MAPPER_FORWARD (expm1) MAPPER_FORWARD (finite) MAPPER_FORWARD (fix) MAPPER_FORWARD (floor) @@ -913,6 +914,7 @@ MAPPER_FORWARD (lgamma) MAPPER_FORWARD (log) MAPPER_FORWARD (log10) + MAPPER_FORWARD (log1p) MAPPER_FORWARD (real) MAPPER_FORWARD (round) MAPPER_FORWARD (roundb)