If scaleFloat and exponent are implemented with bit twiddling they can be quite fast. I have a feeling that they involve slow FFI calls in GHC (being the original author of a lot of the code involved).
On Thu, Jul 17, 2008 at 8:21 PM, stefan kersten <[EMAIL PROTECTED]> 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 ... > > <sk> > > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe > _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe