>>>>> 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" > <g...@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@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@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. ______________________________________________ R-help@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.