Numbers that look equal, should be equal, but if() doesn't see as equal (repost with code included)
On Wed, 28 May 2003, Paul Lemmens wrote:
Hoi Thomas, --On woensdag 28 mei 2003 7:16 -0700 Thomas Lumley <tlumley at u.washington.edu> wrote:
On Wed, 28 May 2003, Paul Lemmens wrote:
Hi! Apologies for sending the mail without any code. Apparently somewhere along the way the .R attachments got filtered out. I have included the code below as clean as possible. My original mail is below the code.
I still think you need not to be using ==. You want something like
if ( abs(mean.b-mean.orig)/(epsilon+abs(mean.orig) < epsilon){
You are effectively using epsilon=0, but epsilon=10e-10 should be
adequate.
Based on all the hints and explanations I've changed the test to 'identical(all.equal(mean.b, mean.orig, tolerance=.Machine$double.eps), FALSE)'. I still need to look into the concept of finite precision, because I still don't grasp how sometimes (as an extreme example, probably) 0.25 != 1/4. That this will happen for a number with a lot of different decimals I can understand (by an accumulation of rounding errors).
How you you think 0.25 gets converted to an internal number? It might be 0 + 2/10 + 5/100, and 2/10 and 5/100 cannot be represented exactly in binary arithmetic. (R uses the system's strtod routine, so how it is done is system-dependent: on my systems it does end up with the same bit pattern as 1/4.) As a real example
(0.1 + 0.2) == 0.3
[1] FALSE since
print(c(0.1 + 0.2, 0.3), digits=20)
[1] 0.30000000000000004 0.29999999999999999 yet
print(c(0.1, 0.2, 0.3), digits=20)
[1] 0.1 0.2 0.3
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