[Haskell-cafe] Incorrect behavior in Data.Complex ?

jared simpson jjaredsimpson at gmail.com
Mon Nov 18 21:54:38 UTC 2013


On Mon, Nov 18, 2013 at 3:24 AM, Ross Paterson <R.Paterson at city.ac.uk>wrote:

> On Sun, Nov 17, 2013 at 08:20:21PM -0800, jared simpson wrote:
> > Prelude Data.Complex> 0**2
> > 0.0
> > Prelude Data.Complex> 0**2 :: Complex Double
> > NaN :+ NaN
> > [...]
> >
> > So Complex uses the default implementation of **. Then when 2*(-inf :+
> 0) is
> > evaluated. We do (2 * -inf - 0*0) :+ (2*0 + -inf*0). Which because of
> -inf*0
> > sets the imaginary part to NaN.
> >
> > Then exp (-inf :+ NaN) = exp x cos y :+ exp x sin y which becomes 0 *
> cos NaN
> > :+ 0 * sin NaN. So we end up with NaN :+ NaN.
> >
> > So is there a library I should be using, or is this a bug?
>
> I would say the default implementation of (**) is wrong: to match the
> Float/Double instances it should be
>
>          x ** y  =  if x == 0 then 0 else exp (log x * y)
> _______________________________________________


Bug filed thanks.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20131118/edd9166f/attachment.html>


More information about the Haskell-Cafe mailing list