https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120747

--- Comment #15 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
```
  A has higher numerical error (3.09998e+02)
  B has ok numerical error (3.12012e+02)

...
So in dump A we compute

x = vnb12 - vnb6 + vnbtot
z = FMA(a, b, FMS(vnb12, 1.2e+1, c)) = a * b + vnb12 * 1.2e+1 - c

and in dump B we have
x = vnbtot - vnb6 + vnb12
z = FMA(vnb12, 1.2e+1, FMS(a, b, c)) = vnb12 * 1.2e+1 + a * b - c
```
So:

a * b + (vnb12 * 1.2e+1 - c)
vs:
vnb12 * 1.2e+1 + (a * b - c)

Which matters as which one is done in infinite precision as rounding error is
not happening in one case but it is in the other.
So it looks like (a * b) are closer in value to (vnb12 * 1.2e+1 - c) than
(vnb12 * 1.2e+1) is to (a * b - c) .

(or the other way around as I noticed the mention of "higher numerical error"
has the one which works), that avoids the rounding error.

Reply via email to