[R] Rounding error in seq(...)

Duncan Murdoch murdoch at stats.uwo.ca
Wed Sep 30 21:25:31 CEST 2009


On 9/30/2009 3:17 PM, Martin Batholdy wrote:
> hum,
> 
> can you explain that a little more detailed?
> Perhaps I miss the background knowledge - but it seems just absurd to  
> me.
> 
> 0.1+0.1+0.1 is 0.3 - there is no rounding involved, is there?

R uses a binary floating point storage format, which is the standard 
thing to do in most languages.  Numbers which are fractions like 1/2, 
1/4 and 57/128 are all representable exactly, because the denominator is 
a power of 2. Whole numbers are also representable exactly.

However, numbers like 1/10 are not.  So R stores something slightly 
different from 1/10 when you say x <- 0.1.  If you compare it to 1/10, 
then it comes out equal, because you're comparing to the same slightly 
incorrect value.

However, by the time you add up 3 of them, the rounding error 
accumulates, and you get a different answer than you'd get from 3/10, 
which is the same as 0.3.

Duncan Murdoch

> 
> why is
> x <- 0.1 + 0.1 +0.1
> not equal to
> y <- 0.3
> 
> ?
> 
> 
> 
> Am 30.09.2009 um 21:04 schrieb Duncan Murdoch:
> 
>> On 9/30/2009 2:50 PM, Michael Knudsen wrote:
>>> On Wed, Sep 30, 2009 at 8:44 PM, Duncan Murdoch  
>>> <murdoch at stats.uwo.ca> wrote:
>>>> Why?  You asked for an increment of 1 in the second case (which is  
>>>> exactly
>>>> represented in R), then divided by 10, so you'll get the same as  
>>>> 0.3 gives
>>>> you.  In the seq() case you asked for an increment of a number  
>>>> close to but
>>>> not equal to 1/10 (because 1/10 is not exactly representable in  
>>>> R), so you
>>>> got something different.
>>> Well, the problem is that I don't know how seq is implemented. I just
>>> assumed that it wouldn't behave like this.
>>
>> It doesn't really matter how it is implemented:  if you ask to start  
>> at 0.1 and increment by 0.1, you should expect the result to be the  
>> same as
>>
>> 0.1
>> 0.1+0.1
>> 0.1+0.1+0.1
>> etc.
>>
>> and I think it is.  The problem is that 0.1+0.1+0.1 is not the same  
>> as 0.3, due to rounding.  Neither 0.1 nor 0.3 can be represented  
>> exactly in the standard IEEE floating point formats that R uses.
>>
>> Duncan Murdoch
>>
>> ______________________________________________
>> R-help at r-project.org 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.




More information about the R-help mailing list