[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