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

Reply via email to