увеличаване на прецизността в Rcpp изхода с плаваща запетая

Опитвам се да отпечатам повече цифри в изход с двойна точност от функция Rcpp, но не мога да разбера как ... Разгледах Как да отпечатам двойна стойност с пълна точност с помощта на 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

person Ben Bolker    schedule 24.12.2013    source източник
comment
Добавих това като проблеми в двете изпълнения на Rcpp, които поддържам: github.com/romainfrancois/Rcpp11/issues /67 github.com/romainfrancois/Rcpp98/issues/10   -  person Romain Francois    schedule 25.12.2013


Отговори (2)


Гледайки вашия свързан отговор, вие пропускате обаждането до 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
person Scott Ritchie    schedule 24.12.2013
comment
Струва си да се отбележи, че ако изключите Rcpp:Rcout.precision с std::cout.precision, ще получите странно поведение: отпечатва само шест цифри вместо 10. - person Scott Ritchie; 25.12.2013

Винаги можете да отидете по друг път:

# 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> 
person Dirk Eddelbuettel    schedule 24.12.2013