I'm trying to use the Rmpfr library with the round() function to apply the round half to even rule and achieve correct results, without errors due the finite precision of float point values. Example of problem: round(1.225,2) #[1] 1.23 So far, this is what I've achieved: library(Rmpfr) x <- c(1.225, 1.2225, 1.22225, 1.222225) n <- c(2, 3, 4, 5) round2 <- function(x, n){ sprintf(paste("%#.", n, "f", sep=""), round(mpfr(as.character(x), 200), n)) } mapply(round2, x, n) #[1] "1.22" "1.222" "1.2222" "1.22222" But in some cases I don't get the desired results: round2(1.152, 2)# Should be 1.15 #[1] "1.16" Reading the Rmpfr docs, at the roundMpfr() function, it says: The mpfr class group method Math2 implements a method for round(x, digits) which rounds to decimal digits. But I can't figure how to use it. How can I achieve desired rounded results? Artur
>>>>> Artur Augusto <arturaugusto at gmail.com> >>>>> on Wed, 19 Nov 2014 15:26:12 -0200 writes:> I'm trying to use the Rmpfr library with the round() function to apply > the round half to even rule and achieve correct results, without > errors due the finite precision of float point values. > Example of problem: > round(1.225,2) > #[1] 1.23 > So far, this is what I've achieved: > library(Rmpfr) > x <- c(1.225, 1.2225, 1.22225, 1.222225) > n <- c(2, 3, 4, 5) > round2 <- function(x, n){ > sprintf(paste("%#.", n, "f", sep=""), round(mpfr(as.character(x), 200), n)) > } > mapply(round2, x, n) > #[1] "1.22" "1.222" "1.2222" "1.22222" The above round2() function is really pretty strange [what do you really want?] but below, you have a very good point : > But in some cases I don't get the desired results: > round2(1.152, 2)# Should be 1.15 > #[1] "1.16" > Reading the Rmpfr docs, at the roundMpfr() function, it says: Actually, roundMpfr() is *not* used by round(<mpfr>, *) It has somewhat different semantics. That's why I used a new function name, roundMpfr(), whereas the round() method for "mpfr" objects is what you get from selectMethod(round, "mpfr") > The mpfr class group method Math2 implements a method for round(x, > digits) which rounds to decimal digits. Indeed... and that is different from the roundMpfr() as mentioned above. > But I can't figure how to use it. > How can I achieve desired rounded results? > Artur Wait a day or two [depending on how quickly the new Rmpfr version 0.5-7 gets published on CRAN], and update your Rmpfr package. The problem is fixed in Rmpfr 0.5-7. If you had CC'ed your e-mail to maintainer("Rmpfr") I would have heard of the problem earlier and almost surely have fixed it earlier. Best regards, Martin Maechler (maintainer of 'Rmpfr').
Thanks Martin, looks like the update fixed the issue. The round2 function is just to format the output. now I can get the correct result: library(Rmpfr) sprintf("%#.2f", round(mpfr(1.152, 200),2)) round2(1.152, 2) #[1] "1.15" Artur 2014-11-27 7:10 GMT-02:00 Martin Maechler <maechler at stat.math.ethz.ch>:>>>>>> Artur Augusto <arturaugusto at gmail.com> >>>>>> on Wed, 19 Nov 2014 15:26:12 -0200 writes: > > > I'm trying to use the Rmpfr library with the round() function to apply > > the round half to even rule and achieve correct results, without > > errors due the finite precision of float point values. > > > Example of problem: > > > round(1.225,2) > > #[1] 1.23 > > > So far, this is what I've achieved: > > > library(Rmpfr) > > x <- c(1.225, 1.2225, 1.22225, 1.222225) > > n <- c(2, 3, 4, 5) > > round2 <- function(x, n){ > > sprintf(paste("%#.", n, "f", sep=""), round(mpfr(as.character(x), 200), n)) > > } > > mapply(round2, x, n) > > #[1] "1.22" "1.222" "1.2222" "1.22222" > > The above round2() function is really pretty strange [what do you really want?] > but below, you have a very good point : > > > But in some cases I don't get the desired results: > > > round2(1.152, 2)# Should be 1.15 > > #[1] "1.16" > > > Reading the Rmpfr docs, at the roundMpfr() function, it says: > > Actually, roundMpfr() is *not* used by round(<mpfr>, *) > It has somewhat different semantics. That's why I used a new > function name, roundMpfr(), whereas the round() method for > "mpfr" objects is what you get from > > selectMethod(round, "mpfr") > > > The mpfr class group method Math2 implements a method for round(x, > > digits) which rounds to decimal digits. > > Indeed... and that is different from the roundMpfr() as > mentioned above. > > > But I can't figure how to use it. > > > How can I achieve desired rounded results? > > Artur > > Wait a day or two [depending on how quickly the new Rmpfr version 0.5-7 > gets published on CRAN], and update your Rmpfr package. > The problem is fixed in Rmpfr 0.5-7. > > If you had CC'ed your e-mail to > maintainer("Rmpfr") > I would have heard of the problem earlier and almost surely > have fixed it earlier. > > Best regards, > Martin Maechler (maintainer of 'Rmpfr').