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

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