| ▲ | jcranmer 7 hours ago | |||||||
> Now, if a and b are already float, then it's equivalent. Not necessarily! Floating-point contraction is allowable essentially within statements but not across them. By assigning the result of a * b into a value, you prohibit contraction from being able to contract with the addition into an FMA. In practice, every compiler has fast-math flags which says stuff it and allows all of these optimizations to occur across statements and even across inline boundaries. (Then there's also the issue of FLT_EVAL_METHOD, another area where what the standard says and what compilers actually do are fairly diametrically opposed.) | ||||||||
| ▲ | kazinator 6 hours ago | parent | next [-] | |||||||
The first mention of contraction in the standard (I'm looking at N3220 draft that I have handy) is: A floating expression may be contracted, that is, evaluated as though it were a single opera- tion, thereby omitting rounding errors implied by the source code and the expression evalua- tion method.86) The FP_CONTRACT pragma in <math.h> provides a way to disallow contracted expressions. Otherwise, whether and how expressions are contracted is implementation-defined. If you're making a language that generates C, it's probably a good idea to pin down which C compilers are supported, and control the options passed to them. Then you can more or less maintain the upper hand on issues like this. | ||||||||
| ▲ | garaetjjte 7 hours ago | parent | prev [-] | |||||||
It seems to me that either you want to allow for contraction everywhere, or not all. Allowing it only sometimes is worst of both worlds. | ||||||||
| ||||||||