If you replace %i with (complex 0 1), you might also consider
replacing ((rat) 1 2) with (/ 1 2) ... printed 1/2 .. in CL
These are obvious but somewhat insidious changes. Who knows
who relies on (if (eq (caar x) 'rat) ......) or that
sqrt(-1) is a symbol.
RJf
Barton Willis wrote:
>Last fall, a few of us talked about replacing the floating point code in
>trigi.lisp
>with Common Lisp functions. I think we agreed that it would be a good
>thing to
>do. I did a few experiments and then forgot about it. We may have even
>talked
>about possibly replacing $%i with $c(0 1) everywhere in Maxima -- this
>would
>allow floating point evaluation without going through $rectform.
>
>My experimental code follows -- it needs testing. I see that I played
>with
>adding error checking to just the asec function. A big chunk of
>trigi.lisp can
>be commented out.
>
>------------------- untested experimental code
>---------------------------------------------------
>
>;; Convert a Lisp complex number to a Maxima expression.
>
>(defun lisp-complex-to-maxima (x)
> (cond ((complexp x) (add (realpart x) `((mtimes simp) $%i ,(imagpart
>x))))
> (t x)))
>
>(defun domain-error (x fn)
> (merror "The number ~:M is not in the domain of ~:M" x fn))
>
>;; These functions only receive real arguments, but they can
>;; return a Maxima complex number
>
>;; Errors aren't handled gracefully -- the asec function has an
>;; play error handler.
>
>;; The conversions to floats might be unnecessary?
>
>(defun acos (x)
> (lisp-complex-to-maxima (lisp:acos (float x 1.0L0))))
>
>;; See A&S 4.4.5
>
>(defun asec (x)
> (let ((y (ignore-errors (acos (/ x)))))
> (if (null y) (domain-error x "$asec") y)))
>
>(defun acosh (x)
> (lisp-complex-to-maxima (lisp:acosh (float x 1.0L0))))
>
>;; See A&S 4.6.5
>(defun asech (x)
> (acosh (/ x)))
>
>(defun asin (x)
> (lisp-complex-to-maxima (lisp:asin (float x 1.0L0))))
>
>;; See A&S 4.4.6
>(defun acsc (x)
> (asin (/ x)))
>
>(defun asinh (x)
> (lisp-complex-to-maxima (lisp:asinh (float x 1.0L0))))
>
>;; See A&S 4.6.4
>(defun acsch (x)
> (asinh (/ x)))
>
>(defun atan1 (x)
> (lisp-complex-to-maxima (lisp:atan (float x 1.0L0))))
>
>;; See A&S 4.4.8
>(defun acot (x)
> (lisp-complex-to-maxima (lisp:atan (/ (float x 1.0L0)))))
>
>(defun atan2 (a &optional (b (float 1.0L0)))
> (lisp-complex-to-maxima (lisp:atan (float a 1.0L0) (float b 1.0L0))))
>
>(defun atanh (x)
> (lisp-complex-to-maxima (lisp:atanh (float x 1.0L0))))
>
>;; See A&S 4.6.6
>(defun acoth (x)
> (atanh (/ x)))
>
>(defun sec (x)
> (/ (lisp:cos (float x 1.0L0))))
>
>(defun cosh (x)
> (lisp-complex-to-maxima (lisp:cosh (float x 1.0L0))))
>
>(defun sech (x)
> (/ (cosh x)))
>
>(defun csc (x)
> (/ (lisp:sin (float x 1.0L0))))
>
>(defun sinh (x)
> (lisp-complex-to-maxima (lisp:sinh (float x 1.0L0))))
>
>(defun csch (x)
> (/ (sinh x)))
>
>(defun tan (x)
> (lisp-complex-to-maxima (lisp:tan (float x 1.0L0))))
>
>(defun cot (x)
> (/ (tan x)))
>
>(defun tanh (x)
> (lisp-complex-to-maxima (lisp:tanh (float x 1.0L0))))
>
>(defun coth (x)
> (/ (tanh x)))
>
>
>------------end of file ------------------------------------------------
>Barton
>
>_______________________________________________
>Maxima mailing list
>Maxima@www.math.utexas.edu
>http://www.math.utexas.edu/mailman/listinfo/maxima
>
>