[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