Re: [Rd] .Call and .C arguments

2010-03-29 Thread Duncan Murdoch

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

2010-03-29 Thread Roger Bergande
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

2010-03-29 Thread Petr Savicky
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