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 ...

<sk>

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to