Don wrote: > Consider this code: > double add(double x, double y) { > return x + y; > } > Is this code pure? (…) > Technically, it isn't. If you change the floating-point rounding mode on > the processor, you get a different result for exactly the same inputs.
IEEE 754-2008, §4 (Attributes and Rounding), prescribes: An attribute is logically associated with a program block to modify its numerical and exception semantics. A user can specify a constant value for an attribute parameter. Some attributes have the effect of an implicit parameter to most individual operations of this standard; language standards shall specify — rounding-direction attributes (see 4.3) and should specify — alternate exception handling attributes (see 8). If D offered some way to statically set these attributes on a block to anything but the default, this could make the code pure. (Unless you explicitly set the mode to “dynamic”, as normally is the case on x86.) More likely, though, you’d want to template code like this on the currently-selected rounding mode. So, can D become the first language to properly implement this aspect of 754-2008? —Joel Salomon