Skip to content

C function, double problem

3 messages · mpietro, Rui Barradas, Dirk Eddelbuettel

#
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:
#
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