Floating point rounding modes: we should restrict them slightly

Don nospam at nospam.com
Sun Sep 13 03:25:38 PDT 2009


Stewart Gordon wrote:
> Don wrote:
> <snip>
>> LISTING ONE:
>>
>> real x = foo(1) + foo(2) + foo(3);
>>
>> LISTING TWO:
>>
>> real x1 = foo(1);
>> real x2 = foo(2);
>> real x3 = foo(3);
>> real x = x1 + x2 + x3;
>>
>> In C and C++ (and currently in D), they are NOT equivalent!
>> foo() is allowed to change the floating-point rounding mode, so it 
>> could change the meaning of '+'.
> <snip>
> 
> This is just one aspect of it.  You could also call a pure function, 
> change the rounding mode, and then call the pure function again on the 
> same arguments.  The value returned would change, thereby violating the 
> purity.

I already presented a proposal for that. This proposal is primarily for 
functions which are not pure.

> There has been some talk about pure functions in relation to locales:
> 
> http://d.puremagic.com/issues/show_bug.cgi?id=3057
> http://www.digitalmars.com/d/archives/digitalmars/D/std.locale_85081.html
> 
> Floating point settings are just another case of the same thing, except 
> that currently violations in relation to the former are allowed.

There's a fundamental difference between them: the floating point 
settings are a hardware feature and it is IMPOSSIBLE to avoid them. You 
can choose not to use locale settings. Or, you can pass them as a 
parameter, which doesn't work for floating point settings.

Please do not get sidetracked on pure functions, it is orthogonal to 
this issue.



More information about the Digitalmars-d mailing list