[R] round() seems inconsistent when  rounding 5s
    Peter Dalgaard BSA 
    p.dalgaard at biostat.ku.dk
       
    Sun Mar 16 11:36:43 CET 2003
    
    
  
ripley at stats.ox.ac.uk writes:
> As people have already suggested, inexact representation.
> 
> 2.45 is being represented as 2.4500000000000002 on my system when printed
> out from the C code in fround.  It is not a binary fraction and so cannot
> be represented exactly (in standard hardware).  The calculation does (2.45
> - 2)*10 and rounds it, and that is just greater than 4.5 (which could be
> represented exactly).
> 
> Try this:
> 
> > x <- 2.45
> > (100*x - 245)
> [1] 2.842171e-14
> 
> which is fairly firm evidence that the representation error is positive, 
> as multiplication by 100 should be exact.  Note though that the print 
> routine will multiply by powers of 10 so the only sure way is to read the 
> bit pattern and compute exactly from that.
Ah, I see now. What I saw before was 
        ltmp = x + 0.5;
        /* implement round to even */
        if(fabs(x + 0.5 - ltmp) < 10*DBL_EPSILON
           && (ltmp % 2 == 1)) ltmp--;
        tmp = ltmp;
but that code sits inside
#ifdef USE_BUILTIN_RINT
and if that's not on we get the system rint() which very likely
will not care about using fuzz.
-- 
   O__  ---- Peter Dalgaard             Blegdamsvej 3  
  c/ /'_ --- Dept. of Biostatistics     2200 Cph. N   
 (*) \(*) -- University of Copenhagen   Denmark      Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)             FAX: (+45) 35327907
    
    
More information about the R-help
mailing list