From savicky at cs.cas.cz  Mon Mar 29 15:23:49 2010
From: savicky at cs.cas.cz (Petr Savicky)
Date: Mon, 29 Mar 2010 15:23:49 +0200
Subject: [Rd] .Call and .C arguments
In-Reply-To: <6fbd4c321003290456t44dc0b05td0243e34ae14cdee@mail.gmail.com>
References: <761A199DCD7BD14189945879D9680183044A6F5E@NS5118.swiss.group4net.com>
	<6fbd4c321003290456t44dc0b05td0243e34ae14cdee@mail.gmail.com>
Message-ID: <20100329132349.GB28381@cs.cas.cz>

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.2449999999999999.

I do not see this value printed in the examples below. So, i think
you assume that 1204.245 was changed to 1204.2449999999999999 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.2449999999998909"

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 at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>



[Rd] .Call and .C arguments
Petr Savicky