# [R] Logical inconsistency

Greg Snow Greg.Snow at imail.org
Tue Dec 9 17:30:08 CET 2008

```Some (possibly all) of those numbers cannot be represented exactly, so there is a chance of round off error whenever you do some arithmetic, sometimes the errors cancel out, sometimes they don't.  Consider:

> print(8.3-7.3, digits=20)
[1] 1.000000000000001
> print(11.3-10.3, digits=20)
[1] 1

So in the first case the rounding error gives a value that is slightly greater than 1, so the greater than test returns true (if you round the result before comparing to 1, then it will return false).  In the second case the uncertainties cancelled out so that you get exactly 1 which is not greater than 1 an so the comparison returns false.

Hope this helps,

--
Gregory (Greg) L. Snow Ph.D.
Statistical Data Center
Intermountain Healthcare
greg.snow at imail.org
801.408.8111

> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-
> project.org] On Behalf Of emma jane
> Sent: Tuesday, December 09, 2008 7:02 AM
> To: Bernardo Rangel Tura; Wacek Kusnierczyk; Chuck Cleland
> Cc: R help
> Subject: Re: [R] Logical inconsistency
>
> Many thanks for your help, perhaps I should have set my query in
> context .... !
>
> I'm simply calculating an indicator variable [0,1] based on the whether
> the difference between two measured variables is > 1 or <=1.
>
> I understand the FAQ about floating point arithmetic, but am still
> puzzled that it only apparently applies to certain elements, as
> follows:
>
> 8.8 - 7.8 > 1
> > TRUE
>
> 8.3 - 7.3 > 1
> > TRUE
>
> However,
>
> 10.2 - 9.2 > 1
> >FALSE
>
> 11.3 - 10.3>1
> > FALSE
>
> Emma Jane
>
>
>
>
> ________________________________
> From: Bernardo Rangel Tura <tura at centroin.com.br>
> To: Wacek Kusnierczyk <Waclaw.Marcin.Kusnierczyk at idi.ntnu.no>
> Cc: R help <R-help at stat.math.ethz.ch>
> Sent: Saturday, 6 December, 2008 10:00:48
> Subject: Re: [R] Logical inconsistency
>
> On Fri, 2008-12-05 at 14:18 +0100, Wacek Kusnierczyk wrote:
> > Berwin A Turlach wrote:
> > > Dear Emma,
> > >
> > > On Fri, 5 Dec 2008 04:23:53 -0800 (PST)
>
> > >
> > >
> > >> Please could someone kindly explain the following inconsistencies
> > >> I've discovered__when performing logical calculations in R:
> > >>
> > >> 8.8 - 7.8 > 1
> > >>
> > >>> TRUE
> > >>>
> > >> 8.3 - 7.3 > 1
> > >>
> > >>> TRUE
> > >>>
> > >
> > > Gladly:  FAQ 7.31
> > > http://cran.at.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-
> th
> > > ink-these-numbers-are-equal_003f
> > >
> > >
> >
> > well, this answer the question only partially.  this explains why a
> > system with finite precision arithmetic, such as r, will fail to be
> > logically correct in certain cases.  it does not explain why r, a
> > language said to isolate a user from the underlying implementational
> > choices, would have to fail this way.
> >
> > there is, in principle, no problem in having a high-level language
> > perform the computation in a logically consistent way.  for example,
> > bc is an "arbitrary precision calculator language", and has no
> problem
> > with examples as the above:
> >
> > bc <<< "8.8 - 7.8 > 1"
> > # 0, meaning 'no'
> >
> > bc <<< "8.3 - 7.3 > 1"
> > # 0, meaning 'no'
> >
> > bc <<< "8.8 - 7.8 == 1"
> > # 1, meaning 'yes'
> >
> >
> > the fact that r (and many others, including matlab and sage, perhaps
> > not
> > mathematica) does not perform logically here is a consequence of its
> > implementation of floating point arithmetic.
> >
> > the faq you were pointed to, and its referring to the goldberg's
> > article, show that r does not successfully isolate a user from
> details
> > of the lower-level implementation.
> >
> > vQ
>
> Well, first of all for 8.-7.3 is not equal to 1 [for computers]
>
> > 8.3-7.3-1
> [1] 8.881784e-16
>
> But if you use only one digit precision
>
> > round(8.3-7.3,1)-1
> [1] 0
> > round(8.3-7.3,1)-1>0
> [1] FALSE
> > round(8.3-7.3,1)==1
> [1] TRUE
>
>
> So the problem is the code write and no the software
>
> --
> Bernardo Rangel Tura, M.D,MPH,Ph.D
> National Institute of Cardiology
> Brazil
>
>
>
>         [[alternative HTML version deleted]]

```