Haskell doesn&#39;t know much about infinity, but Haskell implementations are allowed to use IEEE floating point which has infinity.<br>And to get things right, there needs to be a few changes to the library to do the right thing for certain numbers, this is not news.&nbsp; In fact I filed a bug report a while back about it.
<br><br>&nbsp; -- Lennart<br><br><div><span class="gmail_quote">On 8/4/07, <b class="gmail_sendername">Andrew Coppin</b> &lt;<a href="mailto:andrewcoppin@btinternet.com">andrewcoppin@btinternet.com</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Paul Johnson wrote:<br>&gt; Andrew Coppin wrote:<br>&gt;&gt; &gt; 0**2<br>&gt;&gt; 0<br>&gt;&gt;<br>&gt;&gt; &gt; (0 :+ 0)**2<br>&gt;&gt; NaN :+ NaN<br>&gt;&gt;<br>&gt;&gt; (Is this a bug?)<br>&gt; According to the Standard Prelude,
<br>&gt; #&nbsp;&nbsp; x ** y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;exp (log x * y)<br><br>I had a feeling this would be the cause.<br><br>&gt; &gt; log 0<br>&gt; -Infinity<br><br>Oh. So... since when does Haskell know about infinity?<br><br>BTW, I recently had some code like this:
<br><br>&nbsp;&nbsp;foo x<br>&nbsp;&nbsp;&nbsp;&nbsp;| x &lt; 0 = ...<br>&nbsp;&nbsp;&nbsp;&nbsp;| x == 0 = ...<br>&nbsp;&nbsp;&nbsp;&nbsp;| x &gt; 0 = ...<br><br>I was most perplexed when I got a &quot;non-exhaustive patterns&quot; exception...<br>It turns out there was a NaN in there. I forget about that.
<br><br>&gt; &gt; exp (log 0 * 2)<br>&gt; 0.0<br><br>Well that&#39;s interesting. I did wonder why it *doesn&#39;t* break in the real<br>case...<br><br>&gt; On to the complex number case.&nbsp;&nbsp;From the standard for Complex:<br>
&gt;<br>&gt; # log z&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;log (magnitude z) :+ phase z<br>&gt;<br>&gt; # phase (0 :+ 0) = 0<br>&gt; This is a special case for the phase of zero.<br>&gt;<br>&gt; # (x:+y) * (x&#39;:+y&#39;) =&nbsp;&nbsp;(x*x&#39;-y*y&#39;) :+ (x*y&#39;+y*x&#39;)
<br>&gt;<br>&gt; &gt; log (0 :+ 0)<br>&gt; (-Infinity) :+ 0.0<br>&gt;<br>&gt; &gt; log (0 :+ 0) * 2<br>&gt; (-Infinity) :+ NaN<br>&gt;<br>&gt; Which is the source of the problem.&nbsp;&nbsp;The imaginary part involves<br>&gt; multiplying (-Infinity) by the
<br>&gt; imaginary part of 2 (i.e. 0), which is NaN.<br><br>Um... why would infinity * 0 be NaN? That doesn&#39;t make sense...<br><br>&gt; So no, its not a bug, its according to the standard.<br><br>So I&#39;m the only person who was expecting zero squared to be zero? (IMHO
<br>the standard should try to implement mathematical operations in a<br>mathematically sensible way...)<br><br>&gt; While working through this I also came across the following case which<br>&gt; technically is a bug:<br>
&gt;<br>&gt; &gt; 0 ** 0<br>&gt; 1.0<br>&gt;<br>&gt; &gt; exp (log 0 * 0)<br>&gt; NaN<br>&gt;<br>&gt; I suspect that GHCi is using a built-in exponentiation operator that<br>&gt; doesn&#39;t quite conform to the standard in this case.
<br><br>Now that really *is* odd...<br><br>_______________________________________________<br>Haskell-Cafe mailing list<br><a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br><a href="http://www.haskell.org/mailman/listinfo/haskell-cafe">
http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br></blockquote></div><br>