I just check on how sbcl handles this.  The result was mixed, but
instructive as predicted.

Positive and negative infinity behave as expected.

** (/ 1 0.0)
#.SB-EXT:SINGLE-FLOAT-POSITIVE-INFINITY

* (/ -1 0.0)
*
***#.SB-EXT:SINGLE-FLOAT-NEGATIVE-INFINITY

*
Square roots of negative infinity work as for option 3.

** (sqrt (/ -1 .0))
#C(0.0 #.SB-EXT:SINGLE-FLOAT-POSITIVE-INFINITY)

*
Fourth roots are reasonable as well.
** (sqrt (sqrt (/ -1 0.0)))
#C(#.SB-EXT:SINGLE-FLOAT-POSITIVE-INFINITY
#.SB-EXT:SINGLE-FLOAT-POSITIVE-INFINITY)
*
But, the exponentiation operator is inconsistent with these results and
behaves like option (1) (without documentation as far as I can tell).

** (expt (/ -1 .0) 0.25)
#.SB-EXT:SINGLE-FLOAT-POSITIVE-INFINITY

* (expt (/ -1 .0) 0.5)
#.SB-EXT:SINGLE-FLOAT-POSITIVE-INFINITY
*

On Fri, Jan 2, 2009 at 8:19 PM, Ted Dunning <ted.dunn...@gmail.com> wrote:

> I think that (2) is the easiest for a user to understand.  Obviously, the
> documentation aspect of (1) should be brought along.
>
> The behavior of Common Lisp is always instructive in these regards.  The
> complex arithmetic was generally very well thought out.
>
> On Fri, Jan 2, 2009 at 7:14 PM, Phil Steitz <phil.ste...@gmail.com> wrote:
>
>>  ... I noticed another thing.   Behavior for complex numbers with NaN and
>>> infinite parts is, well, "interesting."  It is consistent with what we do
>>> elsewhere in this class to just apply computational formulas and document
>>> behavior for infinite and NaN; but the current implementation is hard to
>>> document correctly and the results are a little strange for infinite values.
>>>
>>> I see three reasonable choices here, and am interested in others'
>>> opinions.  Please select from the following or suggest something else.
>>>
>>> 1) Leave as is and just point out that the computational formula will
>>> behave strangely for infinite values.
>>>
>>> 2) return {Complex.NaN} or {Complex.INF} respectively when the number has
>>> a NaN or infinite part.
>>>
>>> 3) return {Complex.NaN} when either part is NaN; but for infinite values,
>>> compute the argument using getArgument (atan2), generate the arguments for
>>> the roots from this and select the real/im parts of the roots from {0, inf,
>>> -inf} to match the argument (this will always be possible because atan2
>>> always returns a multiple of pi/4 for infinite arguments).  For example, the
>>> 4th roots of real positive infinity would be {inf + 0i, 0 + infi, -inf + 0i,
>>> 0 + -infi}
>>>
>>> 2) is probably the most defensible mathematically; but 3) is closer to
>>> the spirit of C99x.  Unfortunately, since our implementation of multiply is
>>> 2)-like, 3) does not guarantee that nth roots actually solve the equation
>>> r^n = z.
>>>
>>


-- 
Ted Dunning, CTO
DeepDyve
4600 Bohannon Drive, Suite 220
Menlo Park, CA 94025
www.deepdyve.com
650-324-0110, ext. 738
858-414-0013 (m)

Reply via email to