[Rd] Non identical numerical results from R code vs C/C++ code?

Duncan Murdoch murdoch.duncan at gmail.com
Fri Sep 10 13:18:44 CEST 2010


On 10/09/2010 7:07 AM, Renaud Gaujoux wrote:
> Thank you Duncan for your reply.
> 
> Currently I am using 'double' for the computations.
> What type should I use for extended real in my intermediate computations?

I think it depends on compiler details.  On some compilers "long double" 
will get it, but I don't think there's a standard type that works on all 
compilers.  (In fact, the 80 bit type on Intel chips isn't necessarily 
supported on other hardware.)  R defines LDOUBLE in its header files and 
it is probably best to use that if you want to duplicate R results.

> The result will still be 'double' anyway right?

Yes, you do need to return type double.

Duncan Murdoch

> 
> 
> 
> On 10/09/2010 13:00, Duncan Murdoch wrote:
>> On 10/09/2010 6:46 AM, Renaud Gaujoux wrote:
>>> Hi,
>>>
>>> suppose you have two versions of the same algorithm: one in pure R, 
>>> the other one in C/C++ called via .Call().
>>> Assuming there is no bug in the implementations (i.e. they both do 
>>> the same thing), is there any well known reason why the C/C++ 
>>> implementation could return numerical results non identical to the 
>>> one obtained from the pure R code? (e.g. could it be rounding errors? 
>>> please explain.)
>>> Has anybody had a similar experience?
>> R often uses extended reals (80 bit floating point values on Intel 
>> chips) for intermediate values.  C compilers may or may not do that.
>>> By not identical, I mean very small differences (< 2.4 e-14), but 
>>> enough to have identical() returning FALSE. Maybe I should not 
>>> bother, but I want to be sure where the differences come from, at 
>>> least by mere curiosity.
>>>
>>> Briefly the R code perform multiple matrix product; the C code is an 
>>> optimization of those specific products via custom for loops, where 
>>> entries are not computed in the same order, etc... which improves 
>>> both memory usage and speed. The result is theoretically the same.
>> Changing the order of operations will often affect rounding.  For 
>> example, suppose epsilon is the smallest number such that 1 + epsilon 
>> is not equal to 1.  Then 1 + (epsilon/2) + (epsilon/2) will evaluate 
>> to either 1 or 1 + epsilon, depending on the order of computing the 
>> additions.
>>
>> Duncan Murdoch
>>
>>> Thank you,
>>> Renaud
>>>
> 
>  
> 
> ###
> UNIVERSITY OF CAPE TOWN 
> 
> This e-mail is subject to the UCT ICT policies and e-mail disclaimer published on our website at http://www.uct.ac.za/about/policies/emaildisclaimer/ or obtainable from +27 21 650 4500. This e-mail is intended only for the person(s) to whom it is addressed. If the e-mail has reached you in error, please notify the author. If you are not the intended recipient of the e-mail you may not use, disclose, copy, redirect or print the content. If this e-mail is not related to the business of UCT it is sent by the sender in the sender's individual capacity.
> 
> ###
>  
>



More information about the R-devel mailing list