Re: [Rd] .Call and .C arguments
On 29/03/2010 7:56 AM, Roger Bergande wrote: -- Forwarded message -- From: roger.berga...@swisslife.ch Date: Mon, 29 Mar 2010 13:51:12 +0200 Subject: .Call and .C arguments To: berga...@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.2449. What makes you think those two numbers are different? See FAQ 7.31. Duncan Murdoch 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 __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
Re: [Rd] .Call and .C arguments
Thank you Ducan I'm sorry I wasen't thinking about floating point arithmetic. My problem has nothing to do with the interface. Same rounding in R directly.. Thanks for the hint. Roger __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
Re: [Rd] .Call and .C arguments
On Mon, Mar 29, 2010 at 01:56:14PM +0200, Roger Bergande wrote: ... 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.2449. I do not see this value printed in the examples below. So, i think you assume that 1204.245 was changed to 1204.2449 since rounding it to 2 digits produces 1204.24. The problem is indeed a rounding problem, but not when the number is passed to C. The number 1204.245 cannot be represented in double precision exactly. So, already at the R level is, actually formatC(1204.245, digits=20) # [1] 1204.24498909 See http://rwiki.sciviews.org/doku.php?id=misc:r_accuracy or FAQ 7.31 for more examples. Petr Savicky. 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 __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel