[R] logical inconsistency

Peter Dalgaard p.dalgaard at biostat.ku.dk
Sun Dec 7 09:35:31 CET 2008


John C Nash wrote:
> This actually goes back a very long way. Peter is right to remind us 
> that "optimizers"  (in the sense of compilers) can corrupt algorithms 
> that are well-designed. Optimizing in tests is something some of us have 
> fought for nearly 40 years, but compiler writers don't do much 
> floating-point computation -- they sometimes save a few microseconds of 
> computer time for many days and weeks of human time designing around 
> such silliness. It is worse than a "bug" in that the code to work around 
> the optimization can be very complicated and arcane -- and may not port 
> across architectures. Clearly a program should execute as the code 
> instructs, and not as a compiler designer decides to reinterpret it. 
> Nevertheless, with a fairly large offset of 16.0 or 256.0 I have never 
> seen such a test fail -- and it can port across different precision and 
> different radix arithmetics.  However, I must say I tend to prefer to 
> turn off compile optimization and try to keep my code clean i.e, 
> manually optimized if possible. I also save the two sides of the test to 
> separate variables, though I can guess that some compilers would corrupt 
> that pretty easily.

Yes. I might not have been quite fair to the offset method, the qbeta 
issue was slightly different. (The quantity

tx = xinbta - adj;

was assumed to become equal to xintbta in the original implementation, 
and didn't.

I'm pretty sure the current declaration of xinbta as "volatile" is a 
leftover from a time where the compiler had put xinbta in an 80 bit 
register whereas tx was 64 bit. The 1998 version in SVN also had a 
static volatile xtrunc used to force tx to 64 bit, but I seem to recall 
that we put that there, so presumably there was an even earlier version.)

> Note that historically this issue didn't upset early codes where 
> optimization was manual, then became an issue to watch out for on each 
> implementation when we computed locally, and now could be a nasty but 
> hidden trap with grid and cloud computing when algorithms may be running 
> on a number of different systems, and possibly controlling critical 
> systems.
> 
> JN
> 
> 
> Peter Dalgaard wrote:
>> nashjc at uottawa.ca wrote:
>>> This comment is orthogonal to most of the others. It seems that folk 
>>> often
>>> want to test for equality of "real" numbers. One important one is for
>>> convergence tests. When writing my Compact Numerical Methods book I 
>>> had to
>>> avoid lots of logical tests, but wanted to compare two REALs. I found 
>>> that
>>> the following approach, possibly considered a trick, is to use an offset
>>> and compare
>>>
>>>     xnew + offset
>>>
>>> to
>>>
>>>     xold + offset
>>>
>>> This works on the examples given to motivate the current thread with an
>>> offset of 10, for example.
>>>
>>> Motivation: Small xold, xnew  compare offset with itself. Large xold and
>>> xnew are compared bitwise. Essentially we change from using a 
>>> tolerance to
>>> using 1/tolerance.
>>>
>>> Perfect? No. But usable? Yes. And I believe worth keeping in mind for
>>> those annoying occasions where one needs to do a comparison but wants to
>>> get round the issue of knowing the machine precision etc.
>>
>> Hmm. Echos of some early battles with R's qbeta() in this. I don't 
>> think it can be recommended.
>>
>> The problem is that you can end up in a situation where xnew=xold-1ulp 
>> and xnewnew is xnew+1ulp. I.e. in two iterations you're back at xold.
>>
>> Even in cases where this provably cannot happen, modern optimizers may 
>> make it happen anyway...
>>


-- 
    O__  ---- Peter Dalgaard             Øster Farimagsgade 5, Entr.B
   c/ /'_ --- Dept. of Biostatistics     PO Box 2099, 1014 Cph. K
  (*) \(*) -- University of Copenhagen   Denmark      Ph:  (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)              FAX: (+45) 35327907



More information about the R-help mailing list