Re: [R] understanding integer divide (%/%)

From: Prof Brian Ripley <ripley_at_stats.ox.ac.uk>
Date: Wed 03 Jan 2007 - 17:57:46 GMT

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@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

______________________________________________
R-help@stat.math.ethz.ch mailing list
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.
Received on Thu Jan 04 05:02:06 2007

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Wed 03 Jan 2007 - 18:30:30 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.