# HG changeset patch # User Jaroslav Hajek # Date 1206475001 14400 # Node ID 99c410f7f0b0d4a906b7c3e0f9f14b63c5cf8b3c # Parent ba7a3e20ee3dbeb210c38a0bcf18f1420d7f9b82 implement mapper function for banker's rounding diff -r ba7a3e20ee3d -r 99c410f7f0b0 ChangeLog --- a/ChangeLog Tue Mar 25 15:29:26 2008 -0400 +++ b/ChangeLog Tue Mar 25 15:56:41 2008 -0400 @@ -1,3 +1,7 @@ +2008-03-25 John W. Eaton + + * configure.in: Check for trunc. + 2008-03-21 David Bateman * configure.in (HAVE_AMD): Complete test for presence of amd. diff -r ba7a3e20ee3d -r 99c410f7f0b0 configure.in --- a/configure.in Tue Mar 25 15:29:26 2008 -0400 +++ b/configure.in Tue Mar 25 15:56:41 2008 -0400 @@ -1321,7 +1321,7 @@ 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 umask \ + strncasecmp strnicmp strptime strsignal symlink tempnam tgamma trunc umask \ uname unlink usleep utime vfprintf vsprintf vsnprintf waitpid \ _chmod _snprintf x_utime _utime32) diff -r ba7a3e20ee3d -r 99c410f7f0b0 liboctave/ChangeLog --- a/liboctave/ChangeLog Tue Mar 25 15:29:26 2008 -0400 +++ b/liboctave/ChangeLog Tue Mar 25 15:56:41 2008 -0400 @@ -1,3 +1,13 @@ +2008-03-25 John W. Eaton + + * lo-mappers.cc (xtrunc): New function. + * lo-mappers.h: Provide decl. + +2008-03-25 Jaroslav Hajek + + * lo-mappers.cc (xroundb): New function. + * lo-mappers.h: Provide decl. + 2008-03-23 David Bateman * mx-ops: Definite binary operators for mixed integer array + diff -r ba7a3e20ee3d -r 99c410f7f0b0 liboctave/lo-mappers.cc --- a/liboctave/lo-mappers.cc Tue Mar 25 15:29:26 2008 -0400 +++ b/liboctave/lo-mappers.cc Tue Mar 25 15:56:41 2008 -0400 @@ -80,6 +80,27 @@ } double +xtrunc (double x) +{ +#if defined (HAVE_TRUNC) + return trunc (x); +#else + return x > 0 ? floor (x) : ceil (x); +#endif +} + +double +xroundb (double x) +{ + double t = xround (x); + + if (fabs (x - t) == 0.5) + t = 2 * xtrunc (0.5 * t); + + return t; +} + +double signum (double x) { double tmp = 0.0; @@ -267,6 +288,12 @@ } Complex +xroundb (const Complex& x) +{ + return Complex (xroundb (real (x)), xroundb (imag (x))); +} + +Complex signum (const Complex& x) { double tmp = abs (x); diff -r ba7a3e20ee3d -r 99c410f7f0b0 liboctave/lo-mappers.h --- a/liboctave/lo-mappers.h Tue Mar 25 15:29:26 2008 -0400 +++ b/liboctave/lo-mappers.h Tue Mar 25 15:56:41 2008 -0400 @@ -32,7 +32,9 @@ extern OCTAVE_API double imag (double x); extern OCTAVE_API double real (double x); extern OCTAVE_API double xround (double x); +extern OCTAVE_API double xroundb (double x); extern OCTAVE_API double signum (double x); +extern OCTAVE_API double xtrunc (double x); extern OCTAVE_API double xlog2 (double x); extern OCTAVE_API double xexp2 (double x); @@ -57,6 +59,7 @@ extern OCTAVE_API Complex fix (const Complex& x); extern OCTAVE_API Complex floor (const Complex& x); extern OCTAVE_API Complex xround (const Complex& x); +extern OCTAVE_API Complex xroundb (const Complex& x); extern OCTAVE_API Complex signum (const Complex& x); extern OCTAVE_API bool xisnan (const Complex& x); diff -r ba7a3e20ee3d -r 99c410f7f0b0 src/ChangeLog --- a/src/ChangeLog Tue Mar 25 15:29:26 2008 -0400 +++ b/src/ChangeLog Tue Mar 25 15:56:41 2008 -0400 @@ -1,3 +1,13 @@ +2008-03-25 Jaroslav Hajek + + * mappers.cc (Froundb): New function. + * 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, + 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 roundb mapper function. + 2008-03-25 Jaroslav Hajek * load-save.cc (save_vars): Handle -struct modifier. diff -r ba7a3e20ee3d -r 99c410f7f0b0 src/mappers.cc --- a/src/mappers.cc Tue Mar 25 15:29:26 2008 -0400 +++ b/src/mappers.cc Tue Mar 25 15:56:41 2008 -0400 @@ -804,6 +804,24 @@ return retval; } +DEFUN (roundb, args, , + "-*- texinfo -*-\n\ +@deftypefn {Mapping Function} {} roundb (@var{x})\n\ +Return the integer nearest to @var{x}. If there are two nearest\n\ +integers, return the even one (banker's rounding). If @var{x} is complex,\n\ +return @code{roundb (real (@var{x})) + roundb (imag (@var{x})) * I}.\n\ +@seealso{rem}\n\ +@end deftypefn") +{ + octave_value retval; + if (args.length () == 1) + retval = args(0).roundb (); + else + print_usage (); + + return retval; +} + DEFUN (sign, args, , "-*- texinfo -*-\n\ @deftypefn {Mapping Function} {} sign (@var{x})\n\ diff -r ba7a3e20ee3d -r 99c410f7f0b0 src/ov-base.cc --- a/src/ov-base.cc Tue Mar 25 15:29:26 2008 -0400 +++ b/src/ov-base.cc Tue Mar 25 15:56:41 2008 -0400 @@ -940,6 +940,7 @@ UNDEFINED_MAPPER (log10) UNDEFINED_MAPPER (real) UNDEFINED_MAPPER (round) +UNDEFINED_MAPPER (roundb) UNDEFINED_MAPPER (signum) UNDEFINED_MAPPER (sin) UNDEFINED_MAPPER (sinh) diff -r ba7a3e20ee3d -r 99c410f7f0b0 src/ov-base.h --- a/src/ov-base.h Tue Mar 25 15:29:26 2008 -0400 +++ b/src/ov-base.h Tue Mar 25 15:56:41 2008 -0400 @@ -501,6 +501,7 @@ virtual octave_value log10 (void) const; virtual octave_value real (void) const; virtual octave_value round (void) const; + virtual octave_value roundb (void) const; virtual octave_value signum (void) const; virtual octave_value sin (void) const; virtual octave_value sinh (void) const; diff -r ba7a3e20ee3d -r 99c410f7f0b0 src/ov-bool-mat.h --- a/src/ov-bool-mat.h Tue Mar 25 15:29:26 2008 -0400 +++ b/src/ov-bool-mat.h Tue Mar 25 15:56:41 2008 -0400 @@ -221,6 +221,7 @@ BOOL_MAT_MAPPER (log10) BOOL_MAT_MAPPER (real) BOOL_MAT_MAPPER (round) + BOOL_MAT_MAPPER (roundb) BOOL_MAT_MAPPER (signum) BOOL_MAT_MAPPER (sin) BOOL_MAT_MAPPER (sinh) diff -r ba7a3e20ee3d -r 99c410f7f0b0 src/ov-bool-sparse.h --- a/src/ov-bool-sparse.h Tue Mar 25 15:29:26 2008 -0400 +++ b/src/ov-bool-sparse.h Tue Mar 25 15:56:41 2008 -0400 @@ -177,6 +177,7 @@ BOOL_SPARSE_MAPPER (log10) BOOL_SPARSE_MAPPER (real) BOOL_SPARSE_MAPPER (round) + BOOL_SPARSE_MAPPER (roundb) BOOL_SPARSE_MAPPER (signum) BOOL_SPARSE_MAPPER (sin) BOOL_SPARSE_MAPPER (sinh) diff -r ba7a3e20ee3d -r 99c410f7f0b0 src/ov-bool.h --- a/src/ov-bool.h Tue Mar 25 15:29:26 2008 -0400 +++ b/src/ov-bool.h Tue Mar 25 15:56:41 2008 -0400 @@ -229,6 +229,7 @@ BOOL_MAPPER (log10) BOOL_MAPPER (real) BOOL_MAPPER (round) + BOOL_MAPPER (roundb) BOOL_MAPPER (signum) BOOL_MAPPER (sin) BOOL_MAPPER (sinh) diff -r ba7a3e20ee3d -r 99c410f7f0b0 src/ov-complex.cc --- a/src/ov-complex.cc Tue Mar 25 15:29:26 2008 -0400 +++ b/src/ov-complex.cc Tue Mar 25 15:56:41 2008 -0400 @@ -379,6 +379,7 @@ COMPLEX_MAPPER (log10, std::log10) COMPLEX_MAPPER (real, xreal) COMPLEX_MAPPER (round, xround) +COMPLEX_MAPPER (roundb, xroundb) COMPLEX_MAPPER (signum, ::signum) COMPLEX_MAPPER (sin, std::sin) COMPLEX_MAPPER (sinh, std::sinh) diff -r ba7a3e20ee3d -r 99c410f7f0b0 src/ov-complex.h --- a/src/ov-complex.h Tue Mar 25 15:29:26 2008 -0400 +++ b/src/ov-complex.h Tue Mar 25 15:56:41 2008 -0400 @@ -171,6 +171,7 @@ octave_value log10 (void) const; octave_value real (void) const; octave_value round (void) const; + octave_value roundb (void) const; octave_value signum (void) const; octave_value sin (void) const; octave_value sinh (void) const; diff -r ba7a3e20ee3d -r 99c410f7f0b0 src/ov-cx-mat.cc --- a/src/ov-cx-mat.cc Tue Mar 25 15:29:26 2008 -0400 +++ b/src/ov-cx-mat.cc Tue Mar 25 15:56:41 2008 -0400 @@ -699,6 +699,7 @@ ARRAY_MAPPER (log10, ComplexNDArray::cmapper, std::log10) ARRAY_MAPPER (real, ComplexNDArray::dmapper, xreal) ARRAY_MAPPER (round, ComplexNDArray::cmapper, xround) +ARRAY_MAPPER (roundb, ComplexNDArray::cmapper, xroundb) ARRAY_MAPPER (signum, ComplexNDArray::cmapper, ::signum) ARRAY_MAPPER (sin, ComplexNDArray::cmapper, std::sin) ARRAY_MAPPER (sinh, ComplexNDArray::cmapper, std::sinh) diff -r ba7a3e20ee3d -r 99c410f7f0b0 src/ov-cx-mat.h --- a/src/ov-cx-mat.h Tue Mar 25 15:29:26 2008 -0400 +++ b/src/ov-cx-mat.h Tue Mar 25 15:56:41 2008 -0400 @@ -174,6 +174,7 @@ octave_value log10 (void) const; octave_value real (void) const; octave_value round (void) const; + octave_value roundb (void) const; octave_value signum (void) const; octave_value sin (void) const; octave_value sinh (void) const; diff -r ba7a3e20ee3d -r 99c410f7f0b0 src/ov-cx-sparse.cc --- a/src/ov-cx-sparse.cc Tue Mar 25 15:29:26 2008 -0400 +++ b/src/ov-cx-sparse.cc Tue Mar 25 15:56:41 2008 -0400 @@ -868,6 +868,7 @@ SPARSE_MAPPER (log10, SparseComplexMatrix::cmapper, std::log10) SPARSE_MAPPER (real, SparseComplexMatrix::dmapper, xreal) SPARSE_MAPPER (round, SparseComplexMatrix::cmapper, xround) +SPARSE_MAPPER (roundb, SparseComplexMatrix::cmapper, xroundb) SPARSE_MAPPER (signum, SparseComplexMatrix::cmapper, ::signum) SPARSE_MAPPER (sin, SparseComplexMatrix::cmapper, std::sin) SPARSE_MAPPER (sinh, SparseComplexMatrix::cmapper, std::sinh) diff -r ba7a3e20ee3d -r 99c410f7f0b0 src/ov-cx-sparse.h --- a/src/ov-cx-sparse.h Tue Mar 25 15:29:26 2008 -0400 +++ b/src/ov-cx-sparse.h Tue Mar 25 15:56:41 2008 -0400 @@ -173,6 +173,7 @@ octave_value log10 (void) const; octave_value real (void) const; octave_value round (void) const; + octave_value roundb (void) const; octave_value signum (void) const; octave_value sin (void) const; octave_value sinh (void) const; diff -r ba7a3e20ee3d -r 99c410f7f0b0 src/ov-intx.h --- a/src/ov-intx.h Tue Mar 25 15:29:26 2008 -0400 +++ b/src/ov-intx.h Tue Mar 25 15:56:41 2008 -0400 @@ -252,6 +252,7 @@ NO_OP_MAPPER (floor) NO_OP_MAPPER (real) NO_OP_MAPPER (round) + NO_OP_MAPPER (roundb) #undef NO_OP_MAPPER @@ -506,6 +507,7 @@ NO_OP_MAPPER (floor) NO_OP_MAPPER (real) NO_OP_MAPPER (round) + NO_OP_MAPPER (roundb) #undef NO_OP_MAPPER diff -r ba7a3e20ee3d -r 99c410f7f0b0 src/ov-range.h --- a/src/ov-range.h Tue Mar 25 15:29:26 2008 -0400 +++ b/src/ov-range.h Tue Mar 25 15:56:41 2008 -0400 @@ -304,6 +304,7 @@ RANGE_MAPPER (log10) RANGE_MAPPER (real) RANGE_MAPPER (round) + RANGE_MAPPER (roundb) RANGE_MAPPER (signum) RANGE_MAPPER (sin) RANGE_MAPPER (sinh) diff -r ba7a3e20ee3d -r 99c410f7f0b0 src/ov-re-mat.cc --- a/src/ov-re-mat.cc Tue Mar 25 15:29:26 2008 -0400 +++ b/src/ov-re-mat.cc Tue Mar 25 15:56:41 2008 -0400 @@ -737,6 +737,7 @@ CD_ARRAY_MAPPER (log10, ::log10, std::log10, 0.0, octave_Inf) ARRAY_MAPPER (real, NDArray::dmapper, ::real) ARRAY_MAPPER (round, NDArray::dmapper, xround) +ARRAY_MAPPER (roundb, NDArray::dmapper, xroundb) ARRAY_MAPPER (signum, NDArray::dmapper, ::signum) ARRAY_MAPPER (sin, NDArray::dmapper, ::sin) ARRAY_MAPPER (sinh, NDArray::dmapper, ::sinh) diff -r ba7a3e20ee3d -r 99c410f7f0b0 src/ov-re-mat.h --- a/src/ov-re-mat.h Tue Mar 25 15:29:26 2008 -0400 +++ b/src/ov-re-mat.h Tue Mar 25 15:56:41 2008 -0400 @@ -205,6 +205,7 @@ octave_value log10 (void) const; octave_value real (void) const; octave_value round (void) const; + octave_value roundb (void) const; octave_value signum (void) const; octave_value sin (void) const; octave_value sinh (void) const; diff -r ba7a3e20ee3d -r 99c410f7f0b0 src/ov-re-sparse.cc --- a/src/ov-re-sparse.cc Tue Mar 25 15:29:26 2008 -0400 +++ b/src/ov-re-sparse.cc Tue Mar 25 15:56:41 2008 -0400 @@ -927,6 +927,7 @@ CD_SPARSE_MAPPER (log10, ::log10, std::log10, 0.0, octave_Inf) SPARSE_MAPPER (real, SparseMatrix::dmapper, ::real) SPARSE_MAPPER (round, SparseMatrix::dmapper, xround) +SPARSE_MAPPER (roundb, SparseMatrix::dmapper, xroundb) SPARSE_MAPPER (signum, SparseMatrix::dmapper, ::signum) SPARSE_MAPPER (sin, SparseMatrix::dmapper, ::sin) SPARSE_MAPPER (sinh, SparseMatrix::dmapper, ::sinh) diff -r ba7a3e20ee3d -r 99c410f7f0b0 src/ov-re-sparse.h --- a/src/ov-re-sparse.h Tue Mar 25 15:29:26 2008 -0400 +++ b/src/ov-re-sparse.h Tue Mar 25 15:56:41 2008 -0400 @@ -178,6 +178,7 @@ octave_value log10 (void) const; octave_value real (void) const; octave_value round (void) const; + octave_value roundb (void) const; octave_value signum (void) const; octave_value sin (void) const; octave_value sinh (void) const; diff -r ba7a3e20ee3d -r 99c410f7f0b0 src/ov-scalar.cc --- a/src/ov-scalar.cc Tue Mar 25 15:29:26 2008 -0400 +++ b/src/ov-scalar.cc Tue Mar 25 15:56:41 2008 -0400 @@ -332,6 +332,7 @@ CD_SCALAR_MAPPER (log10, ::log10, std::log10, 0.0, octave_Inf) SCALAR_MAPPER (real, ::real) SCALAR_MAPPER (round, xround) +SCALAR_MAPPER (roundb, xroundb) SCALAR_MAPPER (signum, ::signum) SCALAR_MAPPER (sin, ::sin) SCALAR_MAPPER (sinh, ::sinh) diff -r ba7a3e20ee3d -r 99c410f7f0b0 src/ov-scalar.h --- a/src/ov-scalar.h Tue Mar 25 15:29:26 2008 -0400 +++ b/src/ov-scalar.h Tue Mar 25 15:56:41 2008 -0400 @@ -246,6 +246,7 @@ octave_value log10 (void) const; octave_value real (void) const; octave_value round (void) const; + octave_value roundb (void) const; octave_value signum (void) const; octave_value sin (void) const; octave_value sinh (void) const; diff -r ba7a3e20ee3d -r 99c410f7f0b0 src/ov.h --- a/src/ov.h Tue Mar 25 15:29:26 2008 -0400 +++ b/src/ov.h Tue Mar 25 15:56:41 2008 -0400 @@ -915,6 +915,7 @@ MAPPER_FORWARD (log10) MAPPER_FORWARD (real) MAPPER_FORWARD (round) + MAPPER_FORWARD (roundb) MAPPER_FORWARD (signum) MAPPER_FORWARD (sin) MAPPER_FORWARD (sinh)