我正在尝试在Rcpp
函数的双精度输出中打印更多数字,但无法弄清楚...我已经查看How do I print a double value with full precision using cout?和其他地方的通用C ++回答,但我无法看到如何在Rcpp
中执行此操作,除非使用printf
,我认为这是最后的手段......
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
答案 0 :(得分:7)
查看关联的答案,您错过了对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
答案 1 :(得分:7)
你可以随时走另一条路:
# 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>
与此同时,@ Manetheran也向您展示了标准的iomanip路线。
当然还有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>
哦,为了记录,这些也适用于你想要的输入:
R> ben(1)
[1] "1.000000000000000"
R> ben2(1)
1.000000000000000
R>