From bergarog at gmail.com  Mon Mar 29 13:56:14 2010
From: bergarog at gmail.com (Roger Bergande)
Date: Mon, 29 Mar 2010 13:56:14 +0200
Subject: [Rd] .Call and .C arguments
In-Reply-To: <761A199DCD7BD14189945879D9680183044A6F5E@NS5118.swiss.group4net.com>
References: <761A199DCD7BD14189945879D9680183044A6F5E@NS5118.swiss.group4net.com>
Message-ID: <6fbd4c321003290456t44dc0b05td0243e34ae14cdee@mail.gmail.com>

---------- Forwarded message ----------
From: Roger.Bergande at swisslife.ch
Date: Mon, 29 Mar 2010 13:51:12 +0200
Subject: .Call and .C arguments
To: bergarog at gmail.com

Dear List



My question is about .C and .Call



I was experimenting with the .C and .Call interface as I came across the
following behaviour.

The passed values are not the same in C.  I 'm calling a function in C
with the argument as.double(1204.245) but in the debug mode in C the
value has changed to 1204.2449999999999999.



Is there a way to pass the arguments differently?



I'm using Windows and Visual Studio C++ 2005 Express Edition and
R-2.10.1.





Please see the two simple examples to understand the issue.



# C call from R

.C("myroundC",as.double(1204.245))





// C Code



void myroundC(double *Amount){



            *Amount = Rf_fround(*Amount,2);



}



#Return value in R

[[1]]

[1] 1204.24







# C call from R

.Call("myroundCall",as.double(1204.245))



// C Code

SEXP myroundCall(SEXP a){

            double *ap = REAL(a), *ansp;

            SEXP ans;

            PROTECT(ans = allocVector(REALSXP, 1));

            ansp = REAL(ans);

            *ansp = Rf_fround(*ap,2);

            UNPROTECT(1);

            return(ans);

}



#Return value in R

[1] 1204.24



# expected value 1204.25





Thanks a lot for your help.

Best regards

Roger Bergande



[Rd] .Call and .C arguments
Roger Bergande