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	Tue Mar 25 16:17:16 2008 -0400
+++ b/ChangeLog	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/configure.in	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/doc/interpreter/arith.txi	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/doc/interpreter/func.txi	Tue Mar 25 19:47:21 2008 -0400
@@ -664,6 +664,8 @@
 
 @DOCSTRING(file_in_loadpath)
 
+@DOCSTRING(restoredefaultpath)
+
 @node Subfunctions
 @subsection Subfunctions
 
--- a/doc/interpreter/linalg.txi	Tue Mar 25 16:17:16 2008 -0400
+++ b/doc/interpreter/linalg.txi	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/doc/interpreter/numbers.txi	Tue Mar 25 19:47:21 2008 -0400
@@ -633,6 +633,8 @@
 
 @DOCSTRING(isreal)
 
+@DOCSTRING(isfloat)
+
 @DOCSTRING(iscomplex)
 
 @DOCSTRING(ismatrix)
--- a/liboctave/ChangeLog	Tue Mar 25 16:17:16 2008 -0400
+++ b/liboctave/ChangeLog	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/liboctave/lo-specfun.cc	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/liboctave/lo-specfun.h	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/src/ChangeLog	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/src/mappers.cc	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/src/ov-base.cc	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/src/ov-base.h	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/src/ov-bool-mat.h	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/src/ov-bool-sparse.h	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/src/ov-bool.h	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/src/ov-complex.cc	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/src/ov-complex.h	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/src/ov-cx-mat.cc	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/src/ov-cx-mat.h	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/src/ov-cx-sparse.cc	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/src/ov-cx-sparse.h	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/src/ov-range.h	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/src/ov-re-mat.cc	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/src/ov-re-mat.h	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/src/ov-re-sparse.cc	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/src/ov-re-sparse.h	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/src/ov-scalar.cc	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/src/ov-scalar.h	Tue Mar 25 19:47:21 2008 -0400
@@ -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	Tue Mar 25 16:17:16 2008 -0400
+++ b/src/ov.h	Tue Mar 25 19:47:21 2008 -0400
@@ -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)