[R] Bug in rep() function

Samuel Knapp samuel.k at gmx.de
Mon Sep 15 19:12:20 CEST 2014


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.
>
>



More information about the R-help mailing list