math: fix fma bug on x86 (found by Bruno Haible with gnulib)
authornsz <nsz@port70.net>
Wed, 20 Jun 2012 21:25:58 +0000 (23:25 +0200)
committernsz <nsz@port70.net>
Wed, 20 Jun 2012 21:25:58 +0000 (23:25 +0200)
commite5fb6820a42a1f675ba09c15273953e1ace65777
tree19d075252fdb22352fd147e7c4333cfa015d3b21
parentac4fb51dde2f1fe9371a4cb51ff309d4868245ec
math: fix fma bug on x86 (found by Bruno Haible with gnulib)

The long double adjustment was wrong:
The usual check is
  mant_bits & 0x7ff == 0x400
before doing a mant_bits++ or mant_bits-- adjustment since
this is the only case when rounding an inexact ld80 into
double can go wrong. (only in nearest rounding mode)

After such a check the ++ and -- is ok (the mantissa will end
in 0x401 or 0x3ff).

fma is a bit different (we need to add 3 numbers with correct
rounding: hi_xy + lo_xy + z so we should survive two roundings
at different places without precision loss)

The adjustment in fma only checks for zero low bits
  mant_bits & 0x3ff == 0
this way the adjusted value is correct when rounded to
double or *less* precision.
(this is an important piece in the fma puzzle)

Unfortunately in this case the -- is not a correct adjustment
because mant_bits might underflow so further checks are needed
and this was the source of the bug.
src/math/fma.c