2013-12-24 5 views
7

Я пытаюсь напечатать больше цифр в выводе с двойной точностью из функции Rcpp, но не могу понять, как ... Я просмотрел How do I print a double value with full precision using cout? и в других местах для общих C++ ответ, но я не могу видеть, как сделать это в Rcpp, за исключением использования printf, которую я беру, чтобы быть последним средством ...увеличить точность в выходе с плавающей запятой Rcpp

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

Добавлено это как проблемы в двух реализациях Rcpp я утверждаю: https://github.com/romainfrancois/Rcpp11/issues/67 https://github.com/romainfrancois/Rcpp98/issues/10 –

ответ

6

Глядя на ваш связанный ответ, вы пропустили по телефону 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 
+3

Стоит отметить, что если вы отключите 'Rcpp: Rcout.precision' с' std :: cout.precision', вы получите странный поведение: оно выводит только шесть цифр вместо 10. –

6

Вы всегда можете пойти по другому пути:

# 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> 
Смежные вопросы