[R] Bug in rep() function
William Dunlap
wdunlap at tibco.com
Tue Sep 16 03:52:44 CEST 2014
> Why are the first two yielding an integer after multiplying, and the last two don't?
> Apparently, c(0.8,0.6,0.4,0.2) can't be represented exactly.
Most fractions cannot be represented exactly. Also, you cannot depend
on the third element of seq(.2,.8,by=.2) being equal to .6 (it is
slightly greater). Use subtraction
instead of equality tests to get a better feel for what is happening.
> seq(.2, .8, .2)[3] - .6
[1] 1.110223e-16
> What would be your approach? Always round numbers first, before giving them
> to rep() ?
You can do that or generate integer sequences. It is not just rep() -
any function that interprets an argument as an integer has the same
problem.
Bill Dunlap
TIBCO Software
wdunlap tibco.com
On Mon, Sep 15, 2014 at 10:12 AM, Samuel Knapp <samuel.k at gmx.de> wrote:
> Thank you.
> I got the point with non-integer values in rep(). I also red FAQ 7.3:
> "The only numbers that can be represented exactly in R’s numeric type are
> integers and fractions whose denominator is a power of 2."
>
> But then I still don't understand:
>
>> for (b in seq(0.2,0.8,0.2))
> + {
> + a <- (1-b)*10
> +
> + print(1-b,digits=20)
> + print(a,digits=22)
> + print(trunc(a))
> + print("///////")
> + }
> [1] 0.80000000000000004441
> [1] 8
> [1] 8
> [1] "///////"
> [1] 0.5999999999999999778
> [1] 6
> [1] 6
> [1] "///////"
> [1] 0.39999999999999991118
> [1] 3.999999999999999111822
> [1] 3
> [1] "///////"
> [1] 0.19999999999999995559
> [1] 1.999999999999999555911
> [1] 1
> [1] "///////"
>
> Why are the first two yielding an integer after multiplying, and the last
> two don't? Apparently, c(0.8,0.6,0.4,0.2) can't be represented exactly.
>
> What would be your approach? Always round numbers first, before giving them
> to rep() ?
>
> Thanks,
> Samuel
>
> On 15.09.2014 18:36, Prof Brian Ripley wrote:
>>
>> On 15/09/2014 16:30, Samuel Knapp wrote:
>>>
>>> Dear all,
>>>
>>> I have discovered a bug in the standard rep() function: At certain
>>
>>
>> Not so:
>>
>> > a <- (1-0.9)*100
>> > trunc(a)
>> [1] 9
>>
>> As the help says
>>
>> Non-integer values of ‘times’ will be truncated towards zero. If
>> ‘times’ is a computed quantity it is prudent to add a small fuzz.
>>
>> And as the posting guide said
>>
>> Do your homework before posting:
>> ...
>> Read the online help for relevant functions (type ?functionname, e.g.,
>> ?prod, at the R prompt)
>>
>>
>>> values, rep() does not replicate the element by the proper number of
>>> times:
>>>
>>> > a <- (1-0.9)*100
>>> > a
>>> [1] 10
>>> > length(rep(1,times=a))
>>> [1] 9
>>> > length(rep(1,each=a))
>>> [1] 9
>>>
>>> As shown, this happens as well for the times= as for the each=
>>> parameter. It does not depend on the kind of element that is to be
>>> repeated:
>>>
>>> > length(rep("abc",each=a))
>>> [1] 9
>>>
>>> I tried to narrow down the bug, but haven't really managed to find a
>>> pattern behind the bug. Here is a list with values for a (see above)
>>> that returns a false object ( after the value for a, i've collected the
>>> expected length and the length that is produced by r):
>>>
>>> # mistake at
>>> (1-0.9)*100 10 9
>>> (1-0.8)*100 20 19
>>> (1-0.8)*1000 200 199
>>> (1-0.9)*1000 100 99
>>> (1-0.9)*10 1 0
>>> (1-0.8)*10 2 1
>>> (1-0.9)*1000000000 100000000 99999999
>>> (2-1-0.9)*100 10 9
>>> (10/10-0.9)*100 10 9
>>>
>>> # the following sets for a work fine
>>> (1+0.1)*100
>>> (1-0.1)*100
>>> (1-0.7)*100
>>> (1-0.99)*1000
>>> (1-0.7)*10
>>> (1-0.90)*10
>>> (1-0.95)*100
>>> (1-0.95)*1000
>>> (2-0.9)*1000
>>> (2-1.9)*100
>>> (1.1-1)*100
>>> (10-9)*100
>>>
>>> Did I make any mistake? Or where else should I address this problem?
>>>
>>> Thanks and best regards,
>>> Samuel
>>>
>>> ______________________________________________
>>> 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.
>>
>>
>>
>
> ______________________________________________
> 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