This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Optimize x*x*x*x*x*x using 3 multiplications.
- From: Geoff Keating <geoffk at geoffk dot org>
- To: dewar at gnat dot com (Robert Dewar)
- Cc: gcc at gcc dot gnu dot org
- Date: 01 Aug 2003 12:33:00 -0700
- Subject: Re: [PATCH] Optimize x*x*x*x*x*x using 3 multiplications.
- References: <20030801041740.88506F2E2E@nile.gnat.com>
dewar@gnat.com (Robert Dewar) writes:
> > Optimize x*x*x*x*x*x using 3 multiplications.
>
> It is interesting to note that in general this kind of optimization decreases
> accuracy (it is more accurate to do the full 5 multiplications). Nevertheless
> it is probably reasonable. In Ada 83, this optimization is in fact not
> permitted, since it is not guaranteed to have sufficient accuracy. Ada 95
> deliberately relaxed this accuracy rule to allow this kind of optimization.
We can model a floating-point multiplication '*' of two values, x and y,
as computing
x y (1 + e) < x * y < x y (1 - e)
where 'e' is 1/2 ulp, that is 2^-24 for single-precision IIRC.
So, if we're computing x*x*x*x from left-to-right, we get:
x x (1 + e) < x * x < x x (1 - e)
x x (1 + e) x (1 + e) < (x * x) * x < x x (1 - e) x (1 - e)
x x (1 + e) x (1 + e) x (1 + e)
< ((x * x) * x) * x
< x x (1 - e) x (1 - e) x (1 - e)
If we compute it as (x * x) * (x * x), we get
x x (1 + e) x x (1 + e) (1 + e)
< (x * x) * (x * x)
< x x (1 - e) x x (1 - e) (1 - e)
which, since real arithmetic is associative, is exactly the same as
the previous answer.
--
- Geoffrey Keating <geoffk@geoffk.org>