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, [EMAIL PROTECTED] 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.