[R] Integer division
Göran Broström
gb @end|ng |rom eh@r@@e
Tue Dec 20 07:53:00 CET 2022
Thanks Richard,
the "rounding claim" was my mistake (as I replied to Martin), I should
said "truncates toward zero" as you explain.
However, my point was that these two mathematical functions should be
defined in the documentation, as you also say. And I was surprised that
there is no consensus regarding the definition of such elementary functions.
Göran
On 2022-12-20 03:01, Richard O'Keefe wrote:
> The Fortran '08 standard says <<
> One operand of type integer may be divided by another operand of type
> integer. Although the mathematical
> quotient of two integers is not necessarily an integer, Table 7.2
> specifies that an expression involving the division
> operator with two operands of type integer is interpreted as an
> expression of type integer. The result of such an
> operation is the integer closest to the mathematical quotient and
> between zero and the mathematical quotient
> inclusively. >>
> Another way to say this is that integer division in
> Fortran TRUNCATES towards zero. It does not round and
> never has.
>
> C carefully left the behaviour of integer division (/)
> unspecified, but introduced the div(,) function with the
> same effect as Fortran (/). Later versions of the C
> standard tightened this up, and the C17 standard reads <<
> The result of the / operator is the quotient from the division of the
> first operand by the second; the
> result of the % operator is the remainder. In both operations, if the
> value of the second operand is
> zero, the behavior is undefined.
> When integers are divided, the result of the / operator is the algebraic
> quotient with any fractional
> part discarded. 107) If the quotient a/b is representable, the
> expression (a/b)*b + a%b shall equal a ;
> otherwise, the behavior of both a/b and a%b is undefined.>>
>
> That is, C17 TRUNCATES the result of division towards
> zero. I don't know of any C compiler that rounds,
> certainly gcc does not.
>
>
> The Java 15 Language Specification says
> << Integer division rounds toward 0. >>
> which also specified truncating division.
>
>
> The help for ?"%/%" does not say what the result is.
> Or if it does, I can't find it. Either way, this is
> a defect in the documentation. It needs to be spelled
> out very clearly.
> R version 4.2.2 Patched (2022-11-10 r83330) -- "Innocent and Trusting"
> > c(-8,8) %/% 3
> [1] -3 2
> so we deduce that R *neither* rounds *not* truncates,
> but returns the floor of the quotient.
> It is widely argued that flooring division is more
> generally useful than rounding or truncating division,
> but it is admittedly surprising.
>
> On Tue, 20 Dec 2022 at 02:51, Göran Broström <gb using ehar.se
> <mailto:gb using ehar.se>> wrote:
>
> 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,
> 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 <mailto:R-help using r-project.org> mailing list --
> To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> <https://stat.ethz.ch/mailman/listinfo/r-help>
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
> <http://www.R-project.org/posting-guide.html>
> and provide commented, minimal, self-contained, reproducible code.
>
More information about the R-help
mailing list