[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Changeset] Add the idivide function
From: |
David Bateman |
Subject: |
[Changeset] Add the idivide function |
Date: |
Sun, 23 Mar 2008 22:42:17 +0100 |
User-agent: |
Thunderbird 2.0.0.12 (X11/20080306) |
The attached changeset adds the idivide function as an m-file. It might
arguably be better to add this as a built-function for speed reasons,
but is that worth it..
D.
# HG changeset patch
# User David Bateman <address@hidden>
# Date 1206308391 -3600
# Node ID 8584a758a95de0f34e22e01c10d83013a1528175
# Parent a469b39eb915ffe9bcb1c6ed135c1a47963c59ff
Add the idivide function
diff --git a/scripts/general/Makefile.in b/scripts/general/Makefile.in
--- a/scripts/general/Makefile.in
+++ b/scripts/general/Makefile.in
@@ -36,9 +36,9 @@ SOURCES = __isequal__.m __splinen__.m ac
SOURCES = __isequal__.m __splinen__.m accumarray.m arrayfun.m bicubic.m \
bitcmp.m bitget.m bitset.m blkdiag.m cart2pol.m cart2sph.m cell2mat.m \
celldisp.m circshift.m common_size.m cplxpair.m cumtrapz.m deal.m del2.m \
- diff.m flipdim.m fliplr.m flipud.m gradient.m ind2sub.m int2str.m interp1.m \
- interp2.m interp3.m interpn.m interpft.m is_duplicate_entry.m isa.m \
- isdefinite.m isdir.m isequal.m isequalwithequalnans.m \
+ diff.m flipdim.m fliplr.m flipud.m gradient.m idivide.m ind2sub.m int2str.m \
+ interp1.m interp2.m interp3.m interpn.m interpft.m is_duplicate_entry.m \
+ isa.m isdefinite.m isdir.m isequal.m isequalwithequalnans.m \
isscalar.m issquare.m issymmetric.m isvector.m logical.m logspace.m \
lookup.m mod.m nargchk.m nextpow2.m nthroot.m num2str.m perror.m \
pol2cart.m polyarea.m postpad.m prepad.m quadl.m randperm.m rat.m rem.m \
diff --git a/scripts/general/idivide.m b/scripts/general/idivide.m
new file mode 100644
--- /dev/null
+++ b/scripts/general/idivide.m
@@ -0,0 +1,118 @@
+## Copyright (C) 2008 David Bateman
+##
+## This file is part of Octave.
+##
+## Octave is free software; you can redistribute it and/or modify it
+## under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3 of the License, or (at
+## your option) any later version.
+##
+## Octave is distributed in the hope that it will be useful, but
+## WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with Octave; see the file COPYING. If not, see
+## <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {} idivide (@var{x}, @var{y}, @var{op})
+## Integer division with different round rules. The standard behavior of
+## the an integer division such as @address@hidden ./ @var{b}} is to round
+## the result to the nearest integer. This is not always the desired
+## behavior and @code{idivide} permits integer element-by-element
+## division to be performed with different treatment for the fractional
+## part of the division as determined by the @var{op} flag. @var{op} is
+## a string with one of the values:
+##
+## @table @asis
+## @item 'fix'
+## Calculate @address@hidden ./ @var{b}} with the fractional part rounded
+## towards zero.
+## @item 'round'
+## Calculate @address@hidden ./ @var{b}} with the fractional part rounded
+## towards the nearest integer.
+## @item 'floor'
+## Calculate @address@hidden ./ @var{b}} with the fractional part rounded
+## downwards.
+## @item 'ceil'
+## Calculate @address@hidden ./ @var{b}} with the fractional part rounded
+## upwards.
+## @end table
+##
+## @noindent
+## If @var{op} is not given it is assumed that it is 'fix'. An example
+## demonstrating these rounding rules is
+##
+## @example
+## idivide (int8([-3,3]),int8(4),'fix')
+## @result{} int8([0, 0])
+## idivide (int8([-3,3]),int8(4),'round')
+## @result{} int8([-1, 1])
+## idivide (int8([-3,3]),int8(4),'ceil')
+## @result{} int8([0, 1])
+## idivide (int8([-3,3]),int8(4),'floor')
+## @result{} int8([-1, 0])
+## @end example
+##
+## @seealso{ldivide, rdivide}
+## @end deftypefn
+
+function z = idivide (x, y, op)
+ if (nargin < 2 || nargin > 3)
+ print_usage ();
+ elseif (nargin == 2)
+ op = 'fix';
+ else
+ op = tolower (op);
+ endif
+
+ if (strcmp (op, "round"))
+ z = x ./ y;
+ else
+ if (isfloat (x))
+ typ = class (y);
+ elseif (isfloat (y))
+ typ = class (x);
+ else
+ typ = class (x);
+ if (!strcmp (class (x), class (y)))
+ error ("idivide: incompatible types");
+ endif
+ endif
+
+ if (strcmp (op, "fix"))
+ z = cast (fix (double (x) ./ double (y)), typ);
+ elseif (strcmp (op, "floor"))
+ z = cast (floor (double (x) ./ double (y)), typ);
+ elseif (strcmp (op, "ceil"))
+ z = cast (ceil (double (x) ./ double (y)), typ);
+ else
+ error ("idivide: unrecognized rounding type");
+ endif
+ endif
+endfunction
+
+%!shared a, af, b, bf
+%! a = int8(3);
+%! af = 3;
+%! b = int8([-4, 4]);
+%! bf = [-4, 4];
+
+%!assert (idivide (a, b), int8 ([0, 0]))
+%!assert (idivide (a, b, 'floor'), int8([-1, 0]))
+%!assert (idivide (a, b, 'ceil'), int8 ([0, 1]))
+%!assert (idivide (a, b, 'round'), int8 ([-1, 1]))
+
+%!assert (idivide (af, b), int8 ([0, 0]))
+%!assert (idivide (af, b, 'floor'), int8([-1, 0]))
+%!assert (idivide (af, b, 'ceil'), int8 ([0, 1]))
+%!assert (idivide (af, b, 'round'), int8 ([-1, 1]))
+
+%!assert (idivide (a, bf), int8 ([0, 0]))
+%!assert (idivide (a, bf, 'floor'), int8([-1, 0]))
+%!assert (idivide (a, bf, 'ceil'), int8 ([0, 1]))
+%!assert (idivide (a, bf, 'round'), int8 ([-1, 1]))
+
+%!error (idivide (uint8(1), int8(1)))
- [Changeset] Add the idivide function,
David Bateman <=