| Loic Grenie on Sat, 10 Mar 2007 19:25:21 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: Desired behaviour ? |
* Karim Belabas [2007-03-10 18:13]:
> * Loic Grenie [2007-03-10 17:41]:
> > I'm just wondering if there is a strong reason why 1.*I*I has an
> > imaginary part (equal to 0., but it's there). For instance neither I*I*1.
> > nor 1.*(I*I) have any imaginary part.
>
> 1) Remember that floating point arithmetic is not associative, and need not
> be commutative.
>
> 2) Using the standard formulas for complex arithmetic
>
> (a+bI)(c+dI) = (a*c - b*d) + I (a*d + b*c)
>
> [ 4 multiplications ], we obtain:
>
> (0 + 1.*I) * (0 + I) = (0*0 - 1.) + I*(0*1. + 0*1) = -1.
>
> and imaginary part is indeed an exact 0.
>
> 3) Unfortunately we use Karatsuba (aka 3M) instead of standard formulas,
> and compute
>
> (a+bI)(c+dI) = (a*c - b*d) + I ((a+b)*(c+d) - a*c - b*d)
>
> [ 3 multiplications ]. There the imaginary part becomes
>
> (0 + 1.)*(0 + 1) - (0*0) - (1.*1) = 0.,
>
> NOT an exact 0 !
>
> So, yes, this is expected.
I've read the code and I knew it was expected. The question was: is there
a \underline{strong} reason, meaning: is it reasonable to change the
semantics to gain between 1 and 3% on make bench ?
After Bill's answer, my question has slightly changed though: is it
important that it is 0.I instead of 0I ?
Loïc