Hi everybody, here's my problem: i call a C function which calculates a large number of double values and puts them into an array which is passed from R as a parameter in the function (like .C("function", other parameters, result = as.double( c ( 1 : quantity ) ). When the values come back to R in the result array, they are all truncated to their integer value (i.e. I lose the decimal parts). I think that the problem is that this calculated double numbers are actually too long, with many decimals, because i changed in code the calculated values with arbitrary double values with a few decimals and it works. Has anybody any idea of where the problem is? Thanks in advance! -- View this message in context: http://r.789695.n4.nabble.com/C-function-double-problem-tp4652537.html Sent from the R devel mailing list archive at Nabble.com.
Hello, The double in R and the double in C are the same type, with the same number of decimals (64 bits), so it's not because the numbers are too long. Try calling .C("function", other parameters, result = double(quantity)). Or maybe the error is in the C code, of which we know nothing about. Rui Barradas Em 08-12-2012 02:26, mpietro escreveu:> Hi everybody, > > here's my problem: > > i call a C function which calculates a large number of double values and > puts them into an array which is passed from R as a parameter in the > function (like .C("function", other parameters, result = as.double( c ( 1 > : quantity ) ). > When the values come back to R in the result array, they are all truncated > to their integer value (i.e. I lose the decimal parts). > I think that the problem is that this calculated double numbers are actually > too long, with many decimals, because i changed in code the calculated > values with arbitrary double values with a few decimals and it works. > > Has anybody any idea of where the problem is? > > Thanks in advance! > > > > -- > View this message in context: http://r.789695.n4.nabble.com/C-function-double-problem-tp4652537.html > Sent from the R devel mailing list archive at Nabble.com. > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel
That is great example of why folks should NOT use the .C() interface. Rcpp can help here, __even if you do not use any Rcpp language features__. Below is a showcase for the recent sourceCpp() function which takes a C++ file (shown below), converts it and optionally runs the embedded R code. Think of as something like Sweave for mixing C++ and R rather than Latex and R. Source file is shown via cat on the cmdline: edd at max:/tmp$ cat dblvec.cpp #include <Rcpp.h> #include <vector> // [[Rcpp::export]] std::vector<double> dbl(std::vector<double> x) { std::vector<double> y(x.size()); for (unsigned int i=0; i<y.size(); i++) y[i] = 2.0*x[i]; return y; } /*** R myx <- seq(1.1, 5.5, by=1.1) print(dbl(myx)) ***/ edd at max:/tmp$ edd at max:/tmp$ We then simply source it to show off how it transform a C++ vector of doubles: edd at max:/tmp$ R --quiet -e 'library(Rcpp); sourceCpp("dblvec.cpp")' R> library(Rcpp); sourceCpp("dblvec.cpp") R> myx <- seq(1.1, 5.5, by = 1.1) R> print(dbl(myx)) [1] 2.2 4.4 6.6 8.8 11.0 R> R> edd at max:/tmp$ No make, compiler invocation, linking, ... which all happen behind the scenes. We just enjoy the C++ function to double the content of a double vector. Hope this helps, Dirk -- Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com
Apparently Analagous Threads
- Rcpp, dyn.load and C++ problems
- Rcpp, dyn.load and C++ problems
- Bug report: R.home() cause package Rcpp failed executing sourceCpp, similar bug are labeled "BUG 16660" since 2016 and here I could provide a solution that tested in my laptop.
- Shade area under curve
- Would like to add this to example for plotmath. Can you help?