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

--- Comment #19 from Richard Biener <rguenth at gcc dot gnu.org> ---
I still think we should avoid iteration.  Looking at plus we have

 x = y + a

which is actually

 x = y + a +- 0.5ulp (y + a)

(0.5ulp of the y + a result), so we can compute a as

 a = x - y +- 0.5ulp (y + a)

note 0.5ulp (y + a) isn't 0.5ulp (x), not exactly at least, so we have to
approximate it and a conservative bound is 1ulp (x) here.  We may also have
to make sure to round toward -Inf for the lower bound of the result range
and +Inf of the upper bound of the result range I think.


For multiplication it's

 x = y * a +- 0.5ulp (y *  a)

 a = (x +- 0.5ulp (y * a)) / y

so it's again similar.

So what we can indeed do is widen the LHS range by 0.5 ulp and since we
cannot represent that and it might be imprecise if 1 ulp _after_ the
rounding is smaller than 1 ulp _before_ the rounding operation we simply
use 1 ulp widening of the LHS?

Reply via email to