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