# HG changeset patch # User Jaroslav Hajek # Date 1205058073 -3600 # Node ID a3b2943349aac49610a8b7726416d1651ae4000a # Parent c01ff6818f4c40a0f22fa7ab7a5cad482c854dc5 implement mapper function for banker's rounding diff -r c01ff6818f4c -r a3b2943349aa liboctave/ChangeLog --- a/liboctave/ChangeLog Fri Mar 07 10:04:37 2008 -0500 +++ b/liboctave/ChangeLog Sun Mar 09 11:21:13 2008 +0100 @@ -1,3 +1,7 @@ 2008-03-05 Jaroslav Hajek + + * lo-mappers.cc, lo-mappers.h (xroundb): implement banker's rounding. + 2008-03-05 Jaroslav Hajek * dbleQR.cc (QR::insert_col, QR::insert_row, diff -r c01ff6818f4c -r a3b2943349aa liboctave/lo-mappers.cc --- a/liboctave/lo-mappers.cc Fri Mar 07 10:04:37 2008 -0500 +++ b/liboctave/lo-mappers.cc Sun Mar 09 11:21:13 2008 +0100 @@ -79,6 +79,16 @@ xround (double x) #endif } +double +xroundb (double x) +{ + double t = xround (x); + if (fabs (x-t) == 0.5) + t = 2*trunc (0.5*t); + return t; +} + + double signum (double x) { @@ -264,6 +274,12 @@ xround (const Complex& x) xround (const Complex& x) { return Complex (xround (real (x)), xround (imag (x))); +} + +Complex +xroundb (const Complex& x) +{ + return Complex (xroundb (real (x)), xroundb (imag (x))); } Complex diff -r c01ff6818f4c -r a3b2943349aa liboctave/lo-mappers.h --- a/liboctave/lo-mappers.h Fri Mar 07 10:04:37 2008 -0500 +++ b/liboctave/lo-mappers.h Sun Mar 09 11:21:13 2008 +0100 @@ -32,6 +32,7 @@ extern OCTAVE_API double imag (double x) 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 xlog2 (double x); extern OCTAVE_API double xexp2 (double x); @@ -57,6 +58,7 @@ extern OCTAVE_API Complex fix (const Com 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 c01ff6818f4c -r a3b2943349aa src/ChangeLog --- a/src/ChangeLog Fri Mar 07 10:04:37 2008 -0500 +++ b/src/ChangeLog Sun Mar 09 11:21:13 2008 +0100 @@ -1,3 +1,11 @@ 2008-03-07 John W. Eaton + + * mappers.cc, 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: add support for roundb. + 2008-03-07 John W. Eaton * ov-struct.cc (octave_struct::print_raw): Don't print contents fo diff -r c01ff6818f4c -r a3b2943349aa src/mappers.cc --- a/src/mappers.cc Fri Mar 07 10:04:37 2008 -0500 +++ b/src/mappers.cc Sun Mar 09 11:21:13 2008 +0100 @@ -805,6 +805,24 @@ Return the integer nearest to @var{x}. return retval; } +DEFUN (roundb, args, , + "-*- texinfo -*-\n\ address@hidden {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\ address@hidden address@hidden 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 c01ff6818f4c -r a3b2943349aa src/ov-base.cc --- a/src/ov-base.cc Fri Mar 07 10:04:37 2008 -0500 +++ b/src/ov-base.cc Sun Mar 09 11:21:13 2008 +0100 @@ -932,6 +932,7 @@ UNDEFINED_MAPPER (log10) UNDEFINED_MAPPER (log10) UNDEFINED_MAPPER (real) UNDEFINED_MAPPER (round) +UNDEFINED_MAPPER (roundb) UNDEFINED_MAPPER (signum) UNDEFINED_MAPPER (sin) UNDEFINED_MAPPER (sinh) diff -r c01ff6818f4c -r a3b2943349aa src/ov-base.h --- a/src/ov-base.h Fri Mar 07 10:04:37 2008 -0500 +++ b/src/ov-base.h Sun Mar 09 11:21:13 2008 +0100 @@ -497,6 +497,7 @@ public: 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 c01ff6818f4c -r a3b2943349aa src/ov-bool-mat.h --- a/src/ov-bool-mat.h Fri Mar 07 10:04:37 2008 -0500 +++ b/src/ov-bool-mat.h Sun Mar 09 11:21:13 2008 +0100 @@ -221,6 +221,7 @@ public: 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 c01ff6818f4c -r a3b2943349aa src/ov-bool-sparse.h --- a/src/ov-bool-sparse.h Fri Mar 07 10:04:37 2008 -0500 +++ b/src/ov-bool-sparse.h Sun Mar 09 11:21:13 2008 +0100 @@ -177,6 +177,7 @@ public: 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 c01ff6818f4c -r a3b2943349aa src/ov-bool.h --- a/src/ov-bool.h Fri Mar 07 10:04:37 2008 -0500 +++ b/src/ov-bool.h Sun Mar 09 11:21:13 2008 +0100 @@ -229,6 +229,7 @@ public: BOOL_MAPPER (log10) BOOL_MAPPER (real) BOOL_MAPPER (round) + BOOL_MAPPER (roundb) BOOL_MAPPER (signum) BOOL_MAPPER (sin) BOOL_MAPPER (sinh) diff -r c01ff6818f4c -r a3b2943349aa src/ov-complex.cc --- a/src/ov-complex.cc Fri Mar 07 10:04:37 2008 -0500 +++ b/src/ov-complex.cc Sun Mar 09 11:21:13 2008 +0100 @@ -379,6 +379,7 @@ COMPLEX_MAPPER (log10, std::log10) 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 c01ff6818f4c -r a3b2943349aa src/ov-complex.h --- a/src/ov-complex.h Fri Mar 07 10:04:37 2008 -0500 +++ b/src/ov-complex.h Sun Mar 09 11:21:13 2008 +0100 @@ -169,6 +169,7 @@ public: 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 c01ff6818f4c -r a3b2943349aa src/ov-cx-mat.cc --- a/src/ov-cx-mat.cc Fri Mar 07 10:04:37 2008 -0500 +++ b/src/ov-cx-mat.cc Sun Mar 09 11:21:13 2008 +0100 @@ -699,6 +699,7 @@ ARRAY_MAPPER (log10, ComplexNDArray::cma 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 c01ff6818f4c -r a3b2943349aa src/ov-cx-mat.h --- a/src/ov-cx-mat.h Fri Mar 07 10:04:37 2008 -0500 +++ b/src/ov-cx-mat.h Sun Mar 09 11:21:13 2008 +0100 @@ -172,6 +172,7 @@ public: 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 c01ff6818f4c -r a3b2943349aa src/ov-cx-sparse.cc --- a/src/ov-cx-sparse.cc Fri Mar 07 10:04:37 2008 -0500 +++ b/src/ov-cx-sparse.cc Sun Mar 09 11:21:13 2008 +0100 @@ -868,6 +868,7 @@ SPARSE_MAPPER (log10, SparseComplexMatri 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 c01ff6818f4c -r a3b2943349aa src/ov-cx-sparse.h --- a/src/ov-cx-sparse.h Fri Mar 07 10:04:37 2008 -0500 +++ b/src/ov-cx-sparse.h Sun Mar 09 11:21:13 2008 +0100 @@ -171,6 +171,7 @@ public: 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 c01ff6818f4c -r a3b2943349aa src/ov-intx.h --- a/src/ov-intx.h Fri Mar 07 10:04:37 2008 -0500 +++ b/src/ov-intx.h Sun Mar 09 11:21:13 2008 +0100 @@ -252,6 +252,7 @@ public: NO_OP_MAPPER (floor) NO_OP_MAPPER (real) NO_OP_MAPPER (round) + NO_OP_MAPPER (roundb) #undef NO_OP_MAPPER @@ -506,6 +507,7 @@ public: NO_OP_MAPPER (floor) NO_OP_MAPPER (real) NO_OP_MAPPER (round) + NO_OP_MAPPER (roundb) #undef NO_OP_MAPPER diff -r c01ff6818f4c -r a3b2943349aa src/ov-range.h --- a/src/ov-range.h Fri Mar 07 10:04:37 2008 -0500 +++ b/src/ov-range.h Sun Mar 09 11:21:13 2008 +0100 @@ -299,6 +299,7 @@ public: RANGE_MAPPER (log10) RANGE_MAPPER (real) RANGE_MAPPER (round) + RANGE_MAPPER (roundb) RANGE_MAPPER (signum) RANGE_MAPPER (sin) RANGE_MAPPER (sinh) diff -r c01ff6818f4c -r a3b2943349aa src/ov-re-mat.cc --- a/src/ov-re-mat.cc Fri Mar 07 10:04:37 2008 -0500 +++ b/src/ov-re-mat.cc Sun Mar 09 11:21:13 2008 +0100 @@ -737,6 +737,7 @@ CD_ARRAY_MAPPER (log10, ::log10, std::lo 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 c01ff6818f4c -r a3b2943349aa src/ov-re-mat.h --- a/src/ov-re-mat.h Fri Mar 07 10:04:37 2008 -0500 +++ b/src/ov-re-mat.h Sun Mar 09 11:21:13 2008 +0100 @@ -203,6 +203,7 @@ public: 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 c01ff6818f4c -r a3b2943349aa src/ov-re-sparse.cc --- a/src/ov-re-sparse.cc Fri Mar 07 10:04:37 2008 -0500 +++ b/src/ov-re-sparse.cc Sun Mar 09 11:21:13 2008 +0100 @@ -927,6 +927,7 @@ CD_SPARSE_MAPPER (log10, ::log10, std::l 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 c01ff6818f4c -r a3b2943349aa src/ov-re-sparse.h --- a/src/ov-re-sparse.h Fri Mar 07 10:04:37 2008 -0500 +++ b/src/ov-re-sparse.h Sun Mar 09 11:21:13 2008 +0100 @@ -176,6 +176,7 @@ public: 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 c01ff6818f4c -r a3b2943349aa src/ov-scalar.cc --- a/src/ov-scalar.cc Fri Mar 07 10:04:37 2008 -0500 +++ b/src/ov-scalar.cc Sun Mar 09 11:21:13 2008 +0100 @@ -332,6 +332,7 @@ CD_SCALAR_MAPPER (log10, ::log10, std::l 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 c01ff6818f4c -r a3b2943349aa src/ov-scalar.h --- a/src/ov-scalar.h Fri Mar 07 10:04:37 2008 -0500 +++ b/src/ov-scalar.h Sun Mar 09 11:21:13 2008 +0100 @@ -244,6 +244,7 @@ public: 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 c01ff6818f4c -r a3b2943349aa src/ov.h --- a/src/ov.h Fri Mar 07 10:04:37 2008 -0500 +++ b/src/ov.h Sun Mar 09 11:21:13 2008 +0100 @@ -909,6 +909,7 @@ public: MAPPER_FORWARD (log10) MAPPER_FORWARD (real) MAPPER_FORWARD (round) + MAPPER_FORWARD (roundb) MAPPER_FORWARD (signum) MAPPER_FORWARD (sin) MAPPER_FORWARD (sinh)