octave-maintainers
[Top][All Lists]
Advanced

[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)))

reply via email to

[Prev in Thread] Current Thread [Next in Thread]