On Thu, 17 Jul 2008, stefan kersten wrote:
> On 17.07.2008, at 17:18, Henning Thielemann wrote:
>>> i've attached an example program which seems to indicate that the
>>> magnitude function from Data.Complex is very slow compared to a more naive
>>> implementation (for Complex Float). on my machine (intel core2 duo, osx
>>> 10.4) the CPU time using the library function is about 6-7 times as much
>>> as when using the other function. any ideas what might be going on? any
>>> flaws in my measurement code?
>>>> Complex.magnitude must prevent overflows, that is, if you just square
>> 1e200::Double you get an overflow, although the end result may be also
>> around 1e200. I guess, that to this end Complex.magnitude will separate
>> mantissa and exponent, but this is done via Integers, I'm afraid.
>> very enlightening, thanks! it might be possible to (almost) get the best of
> two worlds (ported from dejagnu's libm):
>> c_magnitude4 :: Complex Float -> Float
> c_magnitude4 (x:+y) = if x' < y'
> then mag y' x'
> else mag x' y'
> where
> x' = abs x
> y' = abs y
> sqr x = x * x
> mag a 0 = a
> mag a b = a * sqrt (1 + sqr (b/a))
>> is fast and doesn't overflow intermediate results but accuracy isn't so great
> ...
Yes, that's also a possible work-around. But division is quite slow.