From ripley at stats.ox.ac.uk  Wed Aug 30 13:52:12 2006
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Wed, 30 Aug 2006 12:52:12 +0100 (BST)
Subject: [Rd] Inaccuracy in seq() (PR#9189)
In-Reply-To: <20060830112545.EC5042245F@slim.kubism.ku.dk>
References: <20060830112545.EC5042245F@slim.kubism.ku.dk>
Message-ID: <Pine.LNX.4.64.0608301228380.10345@gannet.stats.ox.ac.uk>

See the FAQ Q7.31: 0.07 is not exactly representable on your computer.

0.060 + 2*0.005 != 0.070 in computer arithmetic:

> options(digits=18)
> 0.060
[1] 0.06
> 0.070
[1] 0.070000000000000007
> 0.060+2*0.005
[1] 0.06999999999999999
> 0.06+2*0.005 -0.07
[1] -1.3877787807814457e-17
> .Machine$double.eps * 0.07
[1] 1.5543122344752193e-17

On Wed, 30 Aug 2006, kellymj1 at cf.ac.uk wrote:

> Full_Name: Mark James Kelly
> Version: 2.3.1
> OS: Windows
> Submission from: (NULL) (193.63.127.224)
> 
> 
> Sequence produces slightly inaccurate results. 

sequence() is a different function in R.

> #This (supposedely) creates a sequence 0.060,0.065,0.070.....0.30
> thingnor=(seq(0.06,0.30,by=0.005))
> 
> #This does the same but rounds to three decimals
> thingrou=round(seq(0.06,0.30,by=0.005),3)
> 
> #This is another vector, the same length as the two above, with 24 zeroes, then
> 0.070, then 24 zeroes
> otherthing=c(rep(0,24),0.070,rep(0,24))
> 
> 
> #This fails to select the entries equal to 0.070 
> otherthing[otherthing==thingnor[3]]
> 
> #This gives the correct answer
> otherthing[otherthing==thingrou[3]]
> 
> 
> #This compares the two sequences (which should be identical)
> (thingnor-thingrou)

Not according to FAQ Q7.31 and help("==").

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




[Rd] Inaccuracy in seq() (PR#9189)
Prof Brian Ripley