[R] understanding integer divide (%/%)

Prof Brian Ripley ripley at stats.ox.ac.uk
Wed Jan 3 18:57:46 CET 2007


On Wed, 3 Jan 2007, Thomas Lumley wrote:

> On Wed, 3 Jan 2007, ONKELINX, Thierry wrote:
>
>> This is due to the internal representation of 0.1, which is not exactly
>> 0.1 but very close to it. If you want to do an integer divide, you
>> should only use integers to divide with.
>
> This must be more-or-less correct, but it is worth noting that
>> 0.1*10==1
> [1] TRUE
>> 1/0.1==10
> [1] TRUE
>> 1%/%0.1==10
> [1] FALSE
> so it isn't quite that simple.
>
> Interestingly, the results seem to vary by system -- on a G4 Mac I get
> 1 %/% (1/x) == x for all x from 1 to 50

And even 1 %/% 0.1 == 10 on my Linux boxes.

Other things which are going on are the use of extra-precision registers 
(and potentially the system floor() function).

%/% (but not / or *) makes use of a round of iterative refinement.
It does

1/0.1 (10)
rounds down (10)
tmp = 1 - 0.1 *10 (slightly negative)
Oops, the answer must be 10 - 1.

This is needed for consistency since

> 1 %% 0.1
[1] 0.1

on MinGW.

I think the Windows answer is correct, as 0.1 will be stored as 1/8 * 
53-bit binary fraction with leading 1, and according to package gmp

> as.bigq(0.1)
[1] "3602879701896397/36028797018963968"

the denominator being 2^55.  So 1 - 10 * 0.1 is -2/2^55 < 0.

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



More information about the R-help mailing list