
Andrew Coppin wrote:
0**2 0
(0 :+ 0)**2 NaN :+ NaN
(Is this a bug?) According to the Standard Prelude, # x ** y = exp (log x * y)
So 0 ** 2 is equivalent to exp (log 0 * 2)
log 0 -Infinity
log 0 * 2 -Infinity
exp (log 0 * 2) 0.0
On to the complex number case. From the standard for Complex: # log z = log (magnitude z) :+ phase z # phase (0 :+ 0) = 0 This is a special case for the phase of zero. # (x:+y) * (x':+y') = (x*x'-y*y') :+ (x*y'+y*x')
log (0 :+ 0) (-Infinity) :+ 0.0
log (0 :+ 0) * 2 (-Infinity) :+ NaN
Which is the source of the problem. The imaginary part involves multiplying (-Infinity) by the imaginary part of 2 (i.e. 0), which is NaN. So no, its not a bug, its according to the standard. Whether the standard ought to be modified for multiplication by numbers of the form (x :+ 0) is another question. Arguably the correct value in the last case should have been (-Infinity) :+ 0.0 on the grounds that (x :+ y) * 2 should be equal to (x * 2 :+ y * 2). In most cases this holds, but if one of the complex multiplicands contains an infinity then you get a NaN instead. While working through this I also came across the following case which technically is a bug:
0 ** 0 1.0
exp (log 0 * 0) NaN
I suspect that GHCi is using a built-in exponentiation operator that doesn't quite conform to the standard in this case. Paul.