[R] Integer division

Bert Gunter bgunter@4567 @end|ng |rom gm@||@com
Mon Dec 19 19:12:00 CET 2022

```"It would probably be helpful to add a short paragraph to  ?Arithmetic
about the fact that R's %% uses the "floored" version, as
recommended by Donald Knuth and as documented on the above

Agreed (who am I to disagree?!).

But perhaps something simpler like:

"a %% b must always be between 0 (inclusive) and b(exclusive)."

ergo, for examples,
> 5 %% 3
[1] 2  ## 5 = 1*3 + 2
> 5 %% -3
[1] -1 ## 5 = 2*(-3) + (-1)
> -5 %% 3
[1] 1  ## -5 = (-2) * 3 + 1
> -5 %% -3
[1] -2  ## -5 = 1* (-3) + (-2)

My point is that I believe it is easier for most non-math folks to groc the
relationship through a simple rule and such examples than via an algorithm.

Feel free to disagree, as this is just my opinion.

Cheers,
Bert

On Mon, Dec 19, 2022 at 9:30 AM Martin Maechler <maechler using stat.math.ethz.ch>
wrote:

> >>>>> Jeff Newmiller
> >>>>>     on Mon, 19 Dec 2022 08:37:32 -0800 writes:
>
>     > See https://en.m.wikipedia.org/wiki/Modulo_operation,
>     > Variants of the definition, esp the point that Knuth
>     > recommended the floor definition. The behavior of %/%
>     > follows from the definition of %% given the documented
>     > relation in ?Arithmetic.
>
>     > R is not obligated to repeat the mistakes of C or Fortran.
>
> Fortune nomination!  ==> BCC:  maintainer("fortunes")
>
> differently this has been implemented in computer languages.
>
> Then, after all,  Göran still got a point to make here, given that
> not anymore are all R users equipped with a Ph.D in math or equivalent..:
>
> It would probably be helpful to add a short paragraph to  ?Arithmetic
> about the fact that R's %% uses the "floored" version, as
> recommended by Donald Knuth and as documented on the above
>
> Martin
>
>     > On December 19, 2022 7:15:01 AM PST, "Göran Broström"
>     > <gb using ehar.se> wrote:
>     >>
>     >>
>     >> Den 2022-12-19 kl. 15:41, skrev Martin Maechler:
>     >>>>>>>> Göran Broström on Mon, 19 Dec 2022 14:22:00 +0100
>     >>>>>>>> writes:
>     >>>
>     >>> > I have a long vector x with five-digit codes where the
>     >>> > first digit of each is of special interest, so I
>     >>> extracted > them through
>     >>>
>     >>> >> y <- x %/% 10000
>     >>>
>     >>> > but to my surprise y contained the value -1 in some >
>     >>> places. It turned out that x contains -1 as a symbol for
>     >>> > 'missing value' so in effect I found that
>     >>>
>     >>> >> -1 %/% 10000 == -1
>     >>>
>     >>> > Had to check the help page for "%/%", and the first >
>     >>> relevant comment I found was:
>     >>>
>     >>> > "Users are sometimes surprised by the value returned".
>     >>>
>     >>> > No surprise there. Further down:
>     >>>
>     >>> > ‘%%’ indicates ‘x mod y’ (“x modulo y”) and ‘%/%’ >
>     >>> indicates integer division.  It is guaranteed that
>     >>>
>     >>> > ‘ x == (x %% y) + y * (x %/% y) ’ (up to rounding >
>     >>> error)
>     >>>
>     >>> > I did expect (a %/% b) to return round(a / b), like >
>     >>> gfortran and gcc,
>     >>>
>     >>> What???  I cannot believe you.
>     >>
>     >> Well, you shouldn't, I generalized too far.
>     >>>
>     >>> No time for checking now, but I bet that 8 / 3 gives 2
>     >>> and not 3 in C and Fortran (and hence gcc, etc)
>     >>
>     >> But compare -8 %/% 3 in R and -8 / 3 in C/Fortran.
>     >>
>     >> G,
>     >>
>     >>>
>     >>>
>     >>> > but instead I get floor(a / b) in > R. What is the
>     >>> reason for these different definitions? And > shouldn't
>     >>> R's definition be documented?
>     >>>
>     >>>
>     >>>
>     >>> > Thanks, Göran
>     >>>
>     >>> > ______________________________________________ >
>     >>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and
>     >>> > more, see https://stat.ethz.ch/mailman/listinfo/r-help
>     >>> http://www.R-project.org/posting-guide.html and provide
>     >>> > commented, minimal, self-contained, reproducible code.
>     >>
>     >> ______________________________________________
>     >> R-help using r-project.org mailing list -- To UNSUBSCRIBE and
>     >> more, see https://stat.ethz.ch/mailman/listinfo/r-help
>     >> http://www.R-project.org/posting-guide.html and provide
>     >> commented, minimal, self-contained, reproducible code.
>
>     > --
>     > Sent from my phone. Please excuse my brevity.
>
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help