[R] Integer division

Martin Maechler m@ech|er @end|ng |rom @t@t@m@th@ethz@ch
Mon Dec 19 18:30:22 CET 2022


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

The Wikipedia page is indeed revealing amazing facts about how
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
Wikipedia page.

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
    >>> > PLEASE do read the posting guide >
    >>> 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
    >> PLEASE do read the posting guide
    >> http://www.R-project.org/posting-guide.html and provide
    >> commented, minimal, self-contained, reproducible code.

    > -- 
    > Sent from my phone. Please excuse my brevity.



More information about the R-help mailing list