Floating point rounding modes: we should restrict them slightly

Don nospam at nospam.com
Sun Sep 13 11:20:24 PDT 2009


Michel Fortin wrote:
> On 2009-09-13 06:14:02 -0400, Don <nospam at nospam.com> said:
> 
>> double foo() {
>>    return x() + y();
>> }
>> x() and y() can use whichever rounding modes they like, and if they 
>> are impure, they can affect one another, but under this proposal, they 
>> cannot change the meaning of the addition inside foo().
> 
> Problems still may occur if x and y do memoization however. 

Yes, but this is an orthogonal issue, which I have discussed previously.

> Basicaly, any memoization of x() should be discarded when you change the 
> rounding mode.

> Basically, setRoundingMode should act as some sort of barrier for the 
> optimizer, but how?

It's not a big deal, because rounding mode is changed so rarely, so you 
don't need to exactly catch all the cases where memoisation can safely 
be used; you only need to disallow all of the ones where it is unsafe.

I proposed two options: (1) by analogy to SafeD, allow rounding mode and 
float exception flags to be respected only in specially marked modules 
('module(advancedfloatingpoint)' or similar). Memoisation should be 
disabled in such modules. (As a further optimisation, the compiler can 
re-enable memoisation when such functions are called from 
non-advancedfloatingpoint modules).
(2) provide a runtime call to disable memoisation. You'd be obliged to 
call this every time you changed the rounding mode or exception status 
from the default.

I favour (1) because it provides huge optimisation potential for modules 
with default floating point.

The point of all my proposals on this topic, is that these features 
cause a lot of trouble if they're completely unrestrained in the way 
that C/C++ does it, but the semantics required to completely domesticate 
them are not burdensome, and can be done without loss of useful 
functionality.



More information about the Digitalmars-d mailing list