Improve Rcpp Floating Point Accuracy

I am trying to print more digits in double precision output from the Rcpp function, but I can’t figure out how ... I looked at How to do I print a double value with full precision using cout? and elsewhere for a general answer in C ++, but I don't see how to do this in Rcpp , except for using printf , which I accept last resort ...

 require(inline) code <- ' double x=1.0; std::cout.precision(10); // compiles but does nothing Rcpp::Rcout.precision(10); // compiles but does nothing printf("(1) %1.10lf\\n",x); // works but bad practice Rcpp::Rcout << "(2) " << x << std::endl; Rcpp::Rcout << "(3) " << std::setprecision(10) << x << std::endl; return Rcpp::wrap(0); ' fun <- rcpp(sig=c(v=0),body=code,includes="#include <iomanip>") fun(1) ## (1) 1.0000000000 ## (2) 1 ## (3) 1 ## [1] 0 
+7
r rcpp
source share
2 answers

Looking at your answer, you missed the call to std::fixed :

 code2 <- ' double x=1.0; Rcpp::Rcout.precision(10); Rcpp::Rcout << "(1) " << std::fixed << x << std::endl; return Rcpp::wrap(0); ' fun2 <- rcpp(sig=c(v=0),body=code2,includes="#include <iomanip>") fun2(1) ## (1) 1.0000000000 ## [1] 0 
+6
source share

You can always go on a different route:

 # next line is really one line wrapped here R> cppFunction('std::string ben(double val) { char buf[32]; \ snprintf(buf, 31, "%15.15f", val);\ return std::string(buf); }') R> ben(1/3) [1] "0.333333333333333" R> ben(1e6/3) [1] "333333.333333333313931" R> ben(1e12/3) [1] "333333333333.333312988281250" R> 

And in the meantime, @Manetheran also showed you the standard iomanip route.

And of course there is Rprintf() .

 ## the double backslash is needed only for cppFunction R> cppFunction('void ben2(double val) { Rprintf("%15.15f\\n", val); }') R> ben2(1e12/3) 333333333333.333312988281250 R> ben2(1e6/3) 333333.333333333313931 R> 

Oh, and for the record, they also work with your desired input:

 R> ben(1) [1] "1.000000000000000" R> ben2(1) 1.000000000000000 R> 
+6
source share

All Articles