[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