v15i035: Patch for GNU Emacs Calc, version 1.04 -> 1.05, part 08/20

David Gillespie daveg at csvax.cs.caltech.edu
Mon Oct 15 11:17:32 AEST 1990


Posting-number: Volume 15, Issue 35
Submitted-by: daveg at csvax.cs.caltech.edu (David Gillespie)
Archive-name: calc-1.05/part08

#!/bin/sh
# this is part 8 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file calc.patch continued
#
CurArch=8
if test ! -r s2_seq_.tmp
then echo "Please unpack part 1 first!"
     exit 1; fi
( read Scheck
  if test "$Scheck" != $CurArch
  then echo "Please unpack part $Scheck next!"
       exit 1;
  else exit 0; fi
) < s2_seq_.tmp || exit 1
sed 's/^X//' << 'SHAR_EOF' >> calc.patch
X! 	      (while (<= (setq n (1+ n)) 0)
X! 		(setq vec (cons start vec)
X! 		      start (math-mul start (or incr 2)))))
X! 	    (setq vec (nreverse vec)))
X! 	(if (>= n 0)
X! 	    (while (> n 0)
X! 	      (setq vec (cons n vec)
X! 		    n (1- n)))
X! 	  (let ((i -1))
X! 	    (while (>= i n)
X! 	      (setq vec (cons i vec)
X! 		    i (1- i))))))
X!       (cons 'vec vec)))
X  )
X  (fset 'calcFunc-index (symbol-function 'math-vec-index))
X  
X+ ;;; Find an element in a vector.
X+ (defun math-vec-find (vec x &optional start)
X+   (setq start (if start (math-check-fixnum start) 1))
X+   (if (< start 1) (math-reject-arg start 'posp))
X+   (setq vec (nthcdr start vec))
X+   (let ((n start))
X+     (while (and vec (not (math-equal x (car vec))))
X+       (setq n (1+ n)
X+ 	    vec (cdr vec)))
X+     (if vec n 0))
X+ )
X+ (fset 'calcFunc-find (symbol-function 'math-vec-find))
X+ 
X+ ;;; Return a subvector of a vector.
X+ (defun math-subvector (vec start &optional end)
X+   (setq start (math-check-fixnum start)
X+ 	end (math-check-fixnum (or end 0)))
X+   (or (math-vectorp vec) (math-reject-arg vec 'vectorp))
X+   (let ((len (1- (length vec))))
X+     (if (<= start 0)
X+ 	(setq start (+ len start 1)))
X+     (if (<= end 0)
X+ 	(setq end (+ len end 1)))
X+     (if (or (> start len)
X+ 	    (<= end start))
X+ 	'(vec)
X+       (setq vec (nthcdr start vec))
X+       (if (<= end len)
X+ 	  (let ((chop (nthcdr (- end start 1) (setq vec (copy-sequence vec)))))
X+ 	    (setcdr chop nil)))
X+       (cons 'vec vec)))
X+ )
X+ (fset 'calcFunc-subvec (symbol-function 'math-subvector))
X+ 
X+ ;;; Reverse the order of the elements of a vector.
X+ (defun math-reverse-vector (vec)
X+   (if (math-vectorp vec)
X+       (cons 'vec (reverse (cdr vec)))
X+     (math-reject-arg vec 'vectorp))
X+ )
X+ (fset 'calcFunc-rev (symbol-function 'math-reverse-vector))
X+ 
X+ ;;; Compress a vector according to a mask vector.
X+ (defun math-vec-compress (mask vec)
X+   (if (math-numberp mask)
X+       (if (math-zerop mask)
X+ 	  '(vec)
X+ 	vec)
X+     (or (math-vectorp mask) (math-reject-arg mask 'vectorp))
X+     (or (math-constp mask) (math-reject-arg mask 'constp))
X+     (or (math-vectorp vec) (math-reject-arg vec 'vectorp))
X+     (or (= (length mask) (length vec)) (math-dimension-error))
X+     (let ((new nil))
X+       (while (setq mask (cdr mask) vec (cdr vec))
X+ 	(or (math-zerop (car mask))
X+ 	    (setq new (cons (car vec) new))))
X+       (cons 'vec (nreverse new))))
X+ )
X+ (fset 'calcFunc-vmask (symbol-function 'math-vec-compress))
X+ 
X+ ;;; Expand a vector according to a mask vector.
X+ (defun math-vec-expand (mask vec &optional filler)
X+   (or (math-vectorp mask) (math-reject-arg mask 'vectorp))
X+   (or (math-constp mask) (math-reject-arg mask 'constp))
X+   (or (math-vectorp vec) (math-reject-arg vec 'vectorp))
X+   (setq vec (cdr vec))
X+   (let ((new nil))
X+     (while (setq mask (cdr mask))
X+       (if (math-zerop (car mask))
X+ 	  (setq new (cons (or filler (car mask)) new))
X+ 	(setq new (cons (or (car vec) (car mask)) new)
X+ 	      vec (cdr vec))))
X+     (cons 'vec (nreverse new)))
X+ )
X+ (fset 'calcFunc-vexp (symbol-function 'math-vec-expand))
X+ 
X  
X  ;;; Compute the row and column norms of a vector or matrix.  [Public]
X  (defun math-rnorm (a)
X***************
X*** 6824,6832 ****
X  )
X  (fset 'calcFunc-rsort (symbol-function 'math-rsort-vector))
X  
X  
X  ;;; Compile a histogram of data from a vector.
X! (defun math-histogram (vec wts n)
X    (or (Math-vectorp vec)
X        (math-reject-arg vec 'vectorp))
X    (if (Math-vectorp wts)
X--- 11121,11151 ----
X  )
X  (fset 'calcFunc-rsort (symbol-function 'math-rsort-vector))
X  
X+ (defun math-grade-up-vector (grade-vec)
X+   (if (math-vectorp grade-vec)
X+       (let* ((len (1- (length grade-vec))))
X+ 	(cons 'vec (sort (cdr (math-vec-index len)) 'math-grade-beforep)))
X+     (math-reject-arg grade-vec 'vectorp))
X+ )
X+ (fset 'calcFunc-grade (symbol-function 'math-grade-up-vector))
X+ 
X+ (defun math-grade-down-vector (grade-vec)
X+   (if (math-vectorp grade-vec)
X+       (let* ((len (1- (length grade-vec))))
X+ 	(cons 'vec (nreverse (sort (cdr (math-vec-index len))
X+ 				   'math-grade-beforep))))
X+     (math-reject-arg grade-vec 'vectorp))
X+ )
X+ (fset 'calcFunc-rgrade (symbol-function 'math-grade-down-vector))
X+ 
X+ (defun math-grade-beforep (i j)
X+   (math-beforep (nth i grade-vec) (nth j grade-vec))
X+ )
X+ 
X  
X  ;;; Compile a histogram of data from a vector.
X! (defun math-histogram (vec wts &optional n)
X!   (or n (setq n wts wts 1))
X    (or (Math-vectorp vec)
X        (math-reject-arg vec 'vectorp))
X    (if (Math-vectorp wts)
X***************
X*** 7064,7069 ****
X--- 11383,11390 ----
X    m
X  )
X  
X+ ;;;; [calc-arith.el]
X+ 
X  (defun math-abs-approx (a)
X    (cond ((Math-negp a)
X  	 (math-neg a))
X***************
X*** 7078,7089 ****
X  	((eq (car a) 'intv)
X  	 (math-max (math-abs (nth 2 a)) (math-abs (nth 3 a))))
X  	((eq (car a) 'vec)
X! 	 (math-cnorm a))
X  	((eq (car a) 'calcFunc-abs)
X  	 (car a))
X  	(t a))
X  )
X  
X  (defun math-lud-solve (lud b)
X    (and lud
X  	 (let* ((x (math-copy-matrix b))
X--- 11399,11416 ----
X  	((eq (car a) 'intv)
X  	 (math-max (math-abs (nth 2 a)) (math-abs (nth 3 a))))
X  	((eq (car a) 'vec)
X! 	 (math-reduce-vec 'math-add-abs-approx a))
X  	((eq (car a) 'calcFunc-abs)
X  	 (car a))
X  	(t a))
X  )
X  
X+ (defun math-add-abs-approx (a b)
X+   (math-add (math-abs-approx a) (math-abs-approx b))
X+ )
X+ 
X+ ;;;; [calc-mat.el]
X+ 
X  (defun math-lud-solve (lud b)
X    (and lud
X  	 (let* ((x (math-copy-matrix b))
X***************
X*** 7386,7392 ****
X  
X  ;;;; Interval forms.
X  
X! ;;; Build an interval form.  [X I X X]
X  (defun math-make-intv (mask lo hi)
X    (if (memq (car-safe lo) '(cplx polar mod sdev intv vec))
X        (math-reject-arg lo 'realp))
X--- 11713,11719 ----
X  
X  ;;;; Interval forms.
X  
X! ;;; Build an interval form.  [X S X X]
X  (defun math-make-intv (mask lo hi)
X    (if (memq (car-safe lo) '(cplx polar mod sdev intv vec))
X        (math-reject-arg lo 'realp))
X***************
X*** 7405,7410 ****
X--- 11732,11743 ----
X  	    (list 'intv mask lo hi))))
X      (list 'intv mask lo hi))
X  )
X+ (defun calcFunc-intv (mask lo hi)
X+   (if (math-messy-integerp mask) (setq mask (math-trunc mask)))
X+   (or (and (integerp mask) (>= mask 0) (<= mask 3))
X+       (math-reject-arg mask 'range))
X+   (math-make-intv mask lo hi)
X+ )
X  
X  (defun math-sort-intv (mask lo hi)
X    (if (Math-lessp hi lo)
X***************
X*** 7768,7784 ****
X  (defun math-want-polar (a b)
X    (cond ((eq (car-safe a) 'polar)
X  	 (if (eq (car-safe b) 'cplx)
X! 	     (eq car-complex-mode 'polar)
X  	   t))
X  	((eq (car-safe a) 'cplx)
X  	 (if (eq (car-safe b) 'polar)
X! 	     (eq car-complex-mode 'polar)
X  	   nil))
X  	((eq (car-safe b) 'polar)
X  	 t)
X  	((eq (car-safe b) 'cplx)
X  	 nil)
X! 	(t (eq (car-complex-mode 'polar))))
X  )
X  
X  ;;; Force A to be in the (-pi,pi] or (-180,180] range.
X--- 12101,12117 ----
X  (defun math-want-polar (a b)
X    (cond ((eq (car-safe a) 'polar)
X  	 (if (eq (car-safe b) 'cplx)
X! 	     (eq calc-complex-mode 'polar)
X  	   t))
X  	((eq (car-safe a) 'cplx)
X  	 (if (eq (car-safe b) 'polar)
X! 	     (eq calc-complex-mode 'polar)
X  	   nil))
X  	((eq (car-safe b) 'polar)
X  	 t)
X  	((eq (car-safe b) 'cplx)
X  	 nil)
X! 	(t (eq calc-complex-mode 'polar)))
X  )
X  
X  ;;; Force A to be in the (-pi,pi] or (-180,180] range.
X***************
X*** 8019,8031 ****
X  
X  ;;;; [calc-arith.el]
X  
X  (defun math-pow-fancy (a b)
X    (cond ((and (Math-numberp a) (Math-numberp b))
X! 	 (cond ((and (eq (car-safe b) 'frac)
X! 		     (equal (nth 2 b) 2))
X! 		(math-ipow (math-sqrt-raw (math-float a)) (nth 1 b)))
X! 	       ((equal b '(float 5 -1))
X! 		(math-sqrt-raw (math-float a)))
X  	       (t
X  		(math-with-extra-prec 2
X  		  (math-exp-raw
X--- 12352,12379 ----
X  
X  ;;;; [calc-arith.el]
X  
X+ (defun math-mod-fancy (a b)
X+   (cond ((and (eq (car-safe a) 'mod) (Math-realp b) (math-posp b))
X+ 	 (math-make-mod (nth 1 a) b))
X+ 	((and (eq (car-safe a) 'intv) (math-constp a) (math-posp b))
X+ 	 (math-mod-intv a b))
X+ 	(t
X+ 	 (if (Math-anglep a)
X+ 	     (calc-record-why 'anglep b)
X+ 	   (calc-record-why 'anglep a))
X+ 	 (list '% a b)))
X+ )
X+ 
X  (defun math-pow-fancy (a b)
X    (cond ((and (Math-numberp a) (Math-numberp b))
X! 	 (cond ((memq (math-quarter-integer b) '(1 2 3))
X! 		(math-pow (math-sqrt (if (math-floatp b) (math-float a) a))
X! 			  (math-mul 2 b)))
X! 	       ((and (eq (car b) 'frac)
X! 		     (integerp (nth 2 b))
X! 		     (<= (nth 2 b) 10))
X! 		(math-ipow (math-nth-root a (nth 2 b))
X! 			   (nth 1 b)))
X  	       (t
X  		(math-with-extra-prec 2
X  		  (math-exp-raw
X***************
X*** 8141,8146 ****
X--- 12489,12523 ----
X  	 (math-reject-arg b 'numberp)))
X  )
X  
X+ (defun math-quarter-integer (x)
X+   (if (Math-integerp x)
X+       0
X+     (if (math-negp x)
X+ 	(progn
X+ 	  (setq x (math-quarter-integer (math-neg x)))
X+ 	  (and x (- 4 x)))
X+       (if (eq (car x) 'frac)
X+ 	  (if (eq (nth 2 x) 2)
X+ 	      2
X+ 	    (and (eq (nth 2 x) 4)
X+ 		 (progn
X+ 		   (setq x (nth 1 x))
X+ 		   (% (if (consp x) (nth 1 x) x) 4))))
X+ 	(if (eq (car x) 'float)
X+ 	    (if (>= (nth 2 x) 0)
X+ 		0
X+ 	      (if (= (nth 2 x) -1)
X+ 		  (progn
X+ 		    (setq x (nth 1 x))
X+ 		    (and (= (% (if (consp x) (nth 1 x) x) 10) 5) 2))
X+ 		(if (= (nth 2 x) -2)
X+ 		    (progn
X+ 		      (setq x (nth 1 x)
X+ 			    x (% (if (consp x) (nth 1 x) x) 100))
X+ 		      (if (= x 25) 1
X+ 			(if (= x 75) 3))))))))))
X+ )
X+ 
X  ;;; This assumes A < M and M > 0.
X  (defun math-pow-mod (a b m)   ; [R R R R]
X    (if (and (Math-integerp a) (Math-integerp b) (Math-integerp m))
X***************
X*** 8223,8237 ****
X  ;;; with an overestimate always works, even using truncating integer division!
X  (defun math-isqrt (a)
X    (cond ((Math-zerop a) a)
X! 	((Math-negp a)
X! 	 (math-imaginary (math-isqrt (math-neg a))))
X  	((integerp a)
X  	 (math-isqrt-small a))
X- 	((eq (car a) 'bigpos)
X- 	 (math-normalize (cons 'bigpos (cdr (math-isqrt-bignum (cdr a))))))
X  	(t
X! 	 (math-floor (math-sqrt a))))
X  )
X  
X  ;;; This returns (flag . result) where the flag is T if A is a perfect square.
X  (defun math-isqrt-bignum (a)   ; [P.l L]
X--- 12600,12613 ----
X  ;;; with an overestimate always works, even using truncating integer division!
X  (defun math-isqrt (a)
X    (cond ((Math-zerop a) a)
X! 	((not (math-num-natnump a))
X! 	 (math-reject-arg a 'natnump))
X  	((integerp a)
X  	 (math-isqrt-small a))
X  	(t
X! 	 (math-normalize (cons 'bigpos (cdr (math-isqrt-bignum (cdr a)))))))
X  )
X+ (fset 'calcFunc-isqrt (symbol-function 'math-isqrt))
X  
X  ;;; This returns (flag . result) where the flag is T if A is a perfect square.
X  (defun math-isqrt-bignum (a)   ; [P.l L]
X***************
X*** 8267,8272 ****
X--- 12643,12655 ----
X  	    guess)))
X  )
X  
X+ (defun math-zerop-bignum (a)
X+   (and (eq (car a) 0)
X+        (progn
X+ 	 (while (eq (car (setq a (cdr a))) 0))
X+ 	 (null a)))
X+ )
X+ 
X  (defun math-scale-bignum-3 (a n)   ; [L L S]
X    (while (> n 0)
X      (setq a (cons 0 a)
X***************
X*** 8285,8290 ****
X--- 12668,12674 ----
X  )
X  
X  
X+ 
X  ;;;; [calc-ext.el]
X  
X  (defun math-inexact-result ()
X***************
X*** 8395,8413 ****
X  
X  ;;; True if A and B differ only in the last digit of precision.  [P F F]
X  (defun math-nearly-equal-float (a b)
X!   (let ((diff (nth 1 (math-sub-float a b))))
X!     (or (eq diff 0)
X! 	(and (not (consp diff))
X! 	     (< diff 10)
X! 	     (> diff -10)
X! 	     (= diff (if (< (nth 2 a) (nth 2 b))
X! 			 (nth 2 a) (nth 2 b)))
X! 	     (or (= (math-numdigs (nth 1 a)) calc-internal-prec)
X! 		 (= (math-numdigs (nth 1 b)) calc-internal-prec)))))
X! )
X! 
X! (defun math-nearly-equal (a b)   ;  [P R R] [Public]
X!   (math-nearly-equal-float (math-float a) (math-float b))
X  )
X  
X  ;;; True if A is nearly zero compared to B.  [P F F]
X--- 12779,12823 ----
X  
X  ;;; True if A and B differ only in the last digit of precision.  [P F F]
X  (defun math-nearly-equal-float (a b)
X!   (let ((ediff (- (nth 2 a) (nth 2 b))))
X!     (cond ((= ediff 0)   ;; Expanded out for speed
X! 	   (setq ediff (math-add (Math-integer-neg (nth 1 a)) (nth 1 b)))
X! 	   (or (eq ediff 0)
X! 	       (and (not (consp ediff))
X! 		    (< ediff 10)
X! 		    (> ediff -10)
X! 		    (= (math-numdigs (nth 1 a)) calc-internal-prec))))
X! 	  ((= ediff 1)
X! 	   (setq ediff (math-add (Math-integer-neg (nth 1 b))
X! 				 (math-scale-int (nth 1 a) 1)))
X! 	   (and (not (consp ediff))
X! 		(< ediff 10)
X! 		(> ediff -10)
X! 		(= (math-numdigs (nth 1 b)) calc-internal-prec)))
X! 	  ((= ediff -1)
X! 	   (setq ediff (math-add (Math-integer-neg (nth 1 a))
X! 				 (math-scale-int (nth 1 b) 1)))
X! 	   (and (not (consp ediff))
X! 		(< ediff 10)
X! 		(> ediff -10)
X! 		(= (math-numdigs (nth 1 a)) calc-internal-prec)))))
X! )
X! 
X! (defun math-nearly-equal (a b)   ;  [P N N] [Public]
X!   (setq a (math-float a))
X!   (setq b (math-float b))
X!   (if (eq (car a) 'polar) (setq a (math-complex a)))
X!   (if (eq (car b) 'polar) (setq b (math-complex b)))
X!   (if (eq (car a) 'cplx)
X!       (if (eq (car b) 'cplx)
X! 	  (and (math-nearly-equal-float (nth 1 a) (nth 1 b))
X! 	       (math-nearly-equal-float (nth 2 a) (nth 2 b)))
X! 	(and (math-nearly-equal-float (nth 1 a) b)
X! 	     (math-nearly-zerop-float (nth 2 a) b)))
X!       (if (eq (car b) 'cplx)
X! 	  (and (math-nearly-equal-float a (nth 1 b))
X! 	       (math-nearly-zerop-float a (nth 2 b)))
X! 	(math-nearly-equal-float a b)))
X  )
X  
X  ;;; True if A is nearly zero compared to B.  [P F F]
X***************
X*** 8417,8424 ****
X  	  (1+ (- (+ (math-numdigs (nth 1 b)) (nth 2 b)) calc-internal-prec))))
X  )
X  
X! (defun math-nearly-zerop (a b)
X!   (math-nearly-zerop-float (math-float a) (math-float b))
X  )
X  
X  ;;; This implementation could be improved, accuracy-wise.
X--- 12827,12841 ----
X  	  (1+ (- (+ (math-numdigs (nth 1 b)) (nth 2 b)) calc-internal-prec))))
X  )
X  
X! (defun math-nearly-zerop (a b)   ; [P N R] [Public]
X!   (setq a (math-float a))
X!   (setq b (math-float b))
X!   (if (eq (car a) 'cplx)
X!       (and (math-nearly-zerop-float (nth 1 a) b)
X! 	   (math-nearly-zerop-float (nth 2 a) b))
X!     (if (eq (car a) 'polar)
X! 	(math-nearly-zerop-float (nth 1 a) b)
X!       (math-nearly-zerop-float a b)))
X  )
X  
X  ;;; This implementation could be improved, accuracy-wise.
X***************
X*** 8451,8456 ****
X--- 12868,12953 ----
X  
X  
X  
X+ (defun math-nth-root (a n)
X+   (or
X+    (and (= n 2) (math-sqrt a))
X+    (and (Math-zerop a) a)
X+    (and (Math-negp a)
X+ 	(math-pow a (math-div-float '(float 1 0) (math-float n))))
X+    (and (Math-integerp a)
X+ 	(let ((root (math-nth-root-integer a n)))
X+ 	  (if (car root)
X+ 	      (cdr root)
X+ 	    (math-nth-root-float (math-float a) n (math-float (cdr root))))))
X+    (and (eq (car-safe a) 'frac)
X+ 	(let* ((num-root (math-nth-root-integer (nth 1 a) n))
X+ 	       (den-root (math-nth-root-integer (nth 2 a) n)))
X+ 	  (if (and (car num-root) (car den-root))
X+ 	      (list 'frac (cdr num-root) (cdr den-root))
X+ 	    (math-nth-root-float (math-float a) n
X+ 				 (math-div (math-float (cdr num-root))
X+ 					   (math-float (cdr den-root)))))))
X+    (and (eq (car-safe a) 'float)
X+ 	(math-nth-root-float a n))
X+    (and (eq (car-safe a) 'polar)
X+ 	(list 'polar
X+ 	      (math-nth-root (nth 1 a) n)
X+ 	      (math-div (nth 2 a) n)))
X+    (math-pow a (math-div-float '(float 1 0) (math-float n))))
X+ )
X+ 
X+ (defun math-nth-root-float (a n &optional guess)
X+   (math-inexact-result)
X+   (math-with-extra-prec 1
X+     (let ((nf (math-float n))
X+ 	  (nfm1 (math-float (1- n))))
X+       (math-nth-root-float-iter a (or guess
X+ 				      (math-make-float
X+ 				       1 (/ (+ (math-numdigs (nth 1 a))
X+ 					       (nth 2 a)
X+ 					       (/ n 2))
X+ 					    n))))))
X+ )
X+ 
X+ (defun math-nth-root-float-iter (a guess)   ; uses "n", "nf", "nfm1"
X+   (math-working "root" guess)
X+   (let ((g2 (math-div-float (math-add-float (math-mul nfm1 guess)
X+ 					    (math-div-float
X+ 					     a (math-ipow guess (1- n))))
X+ 			    nf)))
X+     (if (math-nearly-equal-float g2 guess)
X+ 	g2
X+       (math-nth-root-float-iter a g2)))
X+ )
X+ 
X+ (defun math-nth-root-integer (a n &optional guess)   ; [I I S]
X+   (math-nth-root-int-iter a (or guess
X+ 				(math-scale-int 1 (/ (+ (math-numdigs a)
X+ 							(1- n))
X+ 						     n))))
X+ )
X+ 
X+ (defun math-nth-root-int-iter (a guess)   ; uses "n"
X+   (math-working "root" guess)
X+   (let* ((q (math-idivmod a (math-ipow guess (1- n))))
X+ 	 (s (math-add (car q) (math-mul (1- n) guess)))
X+ 	 (g2 (math-idivmod s n)))
X+     (if (Math-natnum-lessp (car g2) guess)
X+ 	(math-nth-root-int-iter a (car g2))
X+       (cons (and (equal (car g2) guess)
X+ 		 (eq (cdr q) 0)
X+ 		 (eq (cdr g2) 0))
X+ 	    guess)))
X+ )
X+ 
X+ (defun calcFunc-nroot (x n)
X+   (calcFunc-pow x (if (integerp n)
X+ 		      (math-make-frac 1 n)
X+ 		    (math-div 1 n)))
X+ )
X+ 
X+ 
X+ 
X  ;;;; [calc-arith.el]
X  
X  ;;; Compute the minimum of two real numbers.  [R R R] [Public]
X***************
X*** 8565,8571 ****
X  
X  
X  (defun math-trunc-fancy (a)
X!   (cond ((eq (car a) 'cplx) (math-trunc (nth 1 a)))
X  	((eq (car a) 'polar) (math-trunc (math-complex a)))
X  	((eq (car a) 'hms) (list 'hms (nth 1 a) 0 0))
X  	((eq (car a) 'mod)
X--- 13062,13069 ----
X  
X  
X  (defun math-trunc-fancy (a)
X!   (cond ((eq (car a) 'frac) (math-quotient (nth 1 a) (nth 2 a)))
X! 	((eq (car a) 'cplx) (math-trunc (nth 1 a)))
X  	((eq (car a) 'polar) (math-trunc (math-complex a)))
X  	((eq (car a) 'hms) (list 'hms (nth 1 a) 0 0))
X  	((eq (car a) 'mod)
X***************
X*** 8736,8741 ****
X--- 13234,13265 ----
X  (fset 'calcFunc-scf (symbol-function 'math-scale-float))
X  
X  
X+ (defun math-increment (x &optional step relative-to)
X+   (or step (setq step 1))
X+   (cond ((not (Math-integerp step))
X+ 	 (math-reject-arg step 'integerp))
X+ 	((Math-integerp x)
X+ 	 (math-add x step))
X+ 	((eq (car x) 'float)
X+ 	 (if (and (math-zerop x)
X+ 		  (eq (car-safe relative-to) 'float))
X+ 	     (math-mul step
X+ 		       (math-scale-float relative-to (- 1 calc-internal-prec)))
X+ 	   (math-add-float x (math-make-float
X+ 			      step
X+ 			      (+ (nth 2 x)
X+ 				 (- (math-numdigs (nth 1 x))
X+ 				    calc-internal-prec))))))
X+ 	(t
X+ 	 (math-reject-arg x 'realp)))
X+ )
X+ (fset 'calcFunc-incr (symbol-function 'math-increment))
X+ 
X+ (defun calcFunc-decr (x &optional step relative-to)
X+   (math-increment x (math-neg (or step 1)) relative-to)
X+ )
X+ 
X+ 
X  ;;;; [calc-frac.el]
X  
X  ;;; Convert a real value to fractional form.  [T R I; T R F] [Public]
X***************
X*** 8814,8820 ****
X  )
X  
X  
X! ;;;; [calc-ext.el]
X  
X  (defun math-clean-number (a &optional prec)   ; [X X S] [Public]
X    (if prec
X--- 13338,13344 ----
X  )
X  
X  
X! ;;;; [calc-stuff.el]
X  
X  (defun math-clean-number (a &optional prec)   ; [X X S] [Public]
X    (if prec
X***************
X*** 8856,8862 ****
X      (if (= res 0)
X  	1
X        (if (= res 2)
X! 	  (list 'calcFunc-eq a b)
X  	0)))
X  )
X  
X--- 13380,13388 ----
X      (if (= res 0)
X  	1
X        (if (= res 2)
X! 	  (if (and (math-looks-negp a) (math-looks-negp b))
X! 	      (list 'calcFunc-eq (math-neg a) (math-neg b))
X! 	    (list 'calcFunc-eq a b))
X  	0)))
X  )
X  
X***************
X*** 8865,8871 ****
X      (if (= res 0)
X  	0
X        (if (= res 2)
X! 	  (list 'calcFunc-neq a b)
X  	1)))
X  )
X  
X--- 13391,13399 ----
X      (if (= res 0)
X  	0
X        (if (= res 2)
X! 	  (if (and (math-looks-negp a) (math-looks-negp b))
X! 	      (list 'calcFunc-neq (math-neg a) (math-neg b))
X! 	    (list 'calcFunc-neq a b))
X  	1)))
X  )
X  
X***************
X*** 8874,8880 ****
X      (if (= res -1)
X  	1
X        (if (= res 2)
X! 	  (list 'calcFunc-lt a b)
X  	0)))
X  )
X  
X--- 13402,13410 ----
X      (if (= res -1)
X  	1
X        (if (= res 2)
X! 	  (if (and (math-looks-negp a) (math-looks-negp b))
X! 	      (list 'calcFunc-gt (math-neg a) (math-neg b))
X! 	    (list 'calcFunc-lt a b))
X  	0)))
X  )
X  
X***************
X*** 8883,8889 ****
X      (if (= res 1)
X  	1
X        (if (= res 2)
X! 	  (list 'calcFunc-gt a b)
X  	0)))
X  )
X  
X--- 13413,13421 ----
X      (if (= res 1)
X  	1
X        (if (= res 2)
X! 	  (if (and (math-looks-negp a) (math-looks-negp b))
X! 	      (list 'calcFunc-lt (math-neg a) (math-neg b))
X! 	    (list 'calcFunc-gt a b))
X  	0)))
X  )
X  
X***************
X*** 8892,8898 ****
X      (if (= res 1)
X  	0
X        (if (= res 2)
X! 	  (list 'calcFunc-leq a b)
X  	1)))
X  )
X  
X--- 13424,13432 ----
X      (if (= res 1)
X  	0
X        (if (= res 2)
X! 	  (if (and (math-looks-negp a) (math-looks-negp b))
X! 	      (list 'calcFunc-geq (math-neg a) (math-neg b))
X! 	    (list 'calcFunc-leq a b))
X  	1)))
X  )
X  
X***************
X*** 8901,8907 ****
X      (if (= res -1)
X  	0
X        (if (= res 2)
X! 	  (list 'calcFunc-geq a b)
X  	1)))
X  )
X  
X--- 13435,13443 ----
X      (if (= res -1)
X  	0
X        (if (= res 2)
X! 	  (if (and (math-looks-negp a) (math-looks-negp b))
X! 	      (list 'calcFunc-leq (math-neg a) (math-neg b))
X! 	    (list 'calcFunc-geq a b))
X  	1)))
X  )
X  
X***************
X*** 8934,8940 ****
X        1
X      (if (Math-numberp a)
X  	0
X!       (list 'calcFunc-lnot a)))
X  )
X  
X  (defun calcFunc-if (c e1 e2)
X--- 13470,13480 ----
X        1
X      (if (Math-numberp a)
X  	0
X!       (let ((op (and (= (length a) 3)
X! 		     (assq (car a) calc-tweak-eqn-table))))
X! 	(if op
X! 	    (cons (nth 2 op) (cdr a))
X! 	  (list 'calcFunc-lnot a)))))
X  )
X  
X  (defun calcFunc-if (c e1 e2)
X***************
X*** 8942,8948 ****
X        e2
X      (if (Math-numberp c)
X  	e1
X!       (list 'calcFunc-if c e1 e2)))
X  )
X  
X  (defun math-normalize-logical-op (a)
X--- 13482,13510 ----
X        e2
X      (if (Math-numberp c)
X  	e1
X!       (or (and (Math-vectorp c)
X! 	       (math-constp c)
X! 	       (let ((ee1 (if (Math-vectorp e1)
X! 			      (if (= (length c) (length e1))
X! 				  (cdr e1)
X! 				(calc-record-why "Dimension error" e1))
X! 			    (list e1)))
X! 		     (ee2 (if (Math-vectorp e2)
X! 			      (if (= (length c) (length e2))
X! 				  (cdr e2)
X! 				(calc-record-why "Dimension error" e2))
X! 			    (list e2))))
X! 		 (and ee1 ee2
X! 		      (cons 'vec (math-if-vector (cdr c) ee1 ee2)))))
X! 	  (list 'calcFunc-if c e1 e2))))
X! )
X! 
X! (defun math-if-vector (c e1 e2)
X!   (and c
X!        (cons (if (Math-zerop (car c)) (car e2) (car e1))
X! 	     (math-if-vector (cdr c)
X! 			     (or (cdr e1) e1)
X! 			     (or (cdr e2) e2))))
X  )
X  
X  (defun math-normalize-logical-op (a)
X***************
X*** 8953,8959 ****
X  		 (math-normalize (nth 3 a))
X  	       (if (Math-numberp a1)
X  		   (math-normalize (nth 2 a))
X! 		 (list 'calcFunc-if a1 (nth 2 a) (nth 3 a))))))
X        a)
X  )
X  
X--- 13515,13529 ----
X  		 (math-normalize (nth 3 a))
X  	       (if (Math-numberp a1)
X  		   (math-normalize (nth 2 a))
X! 		 (if (and (Math-vectorp (nth 1 a))
X! 			  (math-constp (nth 1 a)))
X! 		     (calcFunc-if (nth 1 a)
X! 				  (math-normalize (nth 2 a))
X! 				  (math-normalize (nth 3 a)))
X! 		   (let ((calc-simplify-mode 'none))
X! 		     (list 'calcFunc-if a1
X! 			   (math-normalize (nth 2 a))
X! 			   (math-normalize (nth 3 a)))))))))
X        a)
X  )
X  
X***************
X*** 8999,9014 ****
X  	((eq (car a) 'mod) 9)
X  	((eq (car a) 'var) 100)
X  	((eq (car a) 'vec) (if (math-matrixp a) 102 101))
X! 	(t (let ((func (assq (car a) '( ( + . calcFunc-add )
X! 					( - . calcFunc-sub )
X! 					( * . calcFunc-mul )
X! 					( / . calcFunc-div )
X! 					( ^ . calcFunc-pow )
X! 					( % . calcFunc-mod )
X! 					( neg . calcFunc-neg )
X! 					( | . calcFunc-vconcat ) ))))
X! 	     (setq func (if func (cdr func) (car a)))
X! 	     (math-calcFunc-to-var func))))
X  )
X  
X  (defun calcFunc-integer (a)
X--- 13569,13575 ----
X  	((eq (car a) 'mod) 9)
X  	((eq (car a) 'var) 100)
X  	((eq (car a) 'vec) (if (math-matrixp a) 102 101))
X! 	(t (math-calcFunc-to-var func)))
X  )
X  
X  (defun calcFunc-integer (a)
X***************
X*** 9043,9048 ****
X--- 13604,13637 ----
X        0))
X  )
X  
X+ (defun calcFunc-negative (a)
X+   (if (math-looks-negp a)
X+       1
X+     (if (or (math-zerop a)
X+ 	    (math-posp a))
X+ 	0
X+       (list 'calcFunc-negative a)))
X+ )
X+ 
X+ (defun calcFunc-variable (a)
X+   (if (eq (car-safe a) 'var)
X+       1
X+     (if (Math-objvecp a)
X+ 	0
X+       (list 'calcFunc-variable a)))
X+ )
X+ 
X+ (defun calcFunc-nonvar (a)
X+   (if (eq (car-safe a) 'var)
X+       (list 'calcFunc-nonvar a)
X+     1)
X+ )
X+ 
X+ (defun calcFunc-istrue (a)
X+   (if (math-is-true a)
X+       1
X+     0)
X+ )
X  
X  
X  
X***************
X*** 9320,9337 ****
X  (fset 'calcFunc-tan (symbol-function 'math-tan))
X  
X  (defun math-sin-raw (x)   ; [N N]
X!   (cond ((eq (car-safe x) 'cplx)
X  	 (let* ((expx (math-exp-raw (nth 2 x)))
X  		(expmx (math-div-float '(float 1 0) expx))
X  		(sc (math-sin-cos-raw (nth 1 x))))
X  	   (list 'cplx
X  		 (math-mul-float (car sc)
X! 				 (math-mul-float (math-sub expx expmx)
X  						 '(float 5 -1)))
X  		 (math-mul-float (cdr sc)
X! 				 (math-mul-float (math-add-float expx expmx)
X  						 '(float 5 -1))))))
X! 	((eq (car-safe x) 'polar)
X  	 (math-polar (math-sin-raw (math-complex x))))
X  	((Math-integer-negp (nth 1 x))
X  	 (math-neg-float (math-sin-raw (math-neg-float x))))
X--- 13909,13926 ----
X  (fset 'calcFunc-tan (symbol-function 'math-tan))
X  
X  (defun math-sin-raw (x)   ; [N N]
X!   (cond ((eq (car x) 'cplx)
X  	 (let* ((expx (math-exp-raw (nth 2 x)))
X  		(expmx (math-div-float '(float 1 0) expx))
X  		(sc (math-sin-cos-raw (nth 1 x))))
X  	   (list 'cplx
X  		 (math-mul-float (car sc)
X! 				 (math-mul-float (math-add-float expx expmx)
X  						 '(float 5 -1)))
X  		 (math-mul-float (cdr sc)
X! 				 (math-mul-float (math-sub-float expx expmx)
X  						 '(float 5 -1))))))
X! 	((eq (car x) 'polar)
X  	 (math-polar (math-sin-raw (math-complex x))))
X  	((Math-integer-negp (nth 1 x))
X  	 (math-neg-float (math-sin-raw (math-neg-float x))))
X***************
X*** 9343,9349 ****
X  (defun math-cos-raw (x)   ; [N N]
X    (if (eq (car-safe x) 'polar)
X        (math-polar (math-cos-raw (math-complex x)))
X!     (math-sin-raw (math-sub-float (math-pi-over-2) x)))
X  )
X  
X  ;;; This could use a smarter method:  Reduce x as in math-sin-raw, then
X--- 13932,13938 ----
X  (defun math-cos-raw (x)   ; [N N]
X    (if (eq (car-safe x) 'polar)
X        (math-polar (math-cos-raw (math-complex x)))
X!     (math-sin-raw (math-sub (math-pi-over-2) x)))
X  )
X  
X  ;;; This could use a smarter method:  Reduce x as in math-sin-raw, then
X***************
X*** 9354,9361 ****
X  )
X  
X  (defun math-tan-raw (x)   ; [N N]
X!   (cond ((eq (car-safe x) 'cplx)
X! 	 (let* ((x (math-mul-float x '(float 2 0)))
X  		(expx (math-exp-raw (nth 2 x)))
X  		(expmx (math-div-float '(float 1 0) expx))
X  		(sc (math-sin-cos-raw (nth 1 x)))
X--- 13943,13950 ----
X  )
X  
X  (defun math-tan-raw (x)   ; [N N]
X!   (cond ((eq (car x) 'cplx)
X! 	 (let* ((x (math-mul x '(float 2 0)))
X  		(expx (math-exp-raw (nth 2 x)))
X  		(expmx (math-div-float '(float 1 0) expx))
X  		(sc (math-sin-cos-raw (nth 1 x)))
X***************
X*** 9365,9373 ****
X  	   (and (not (eq (nth 1 d) 0))
X  		(list 'cplx
X  		      (math-div-float (car sc) d)
X! 		      (math-div-float (math-mul-float (math-add expx expmx)
X  						      '(float 5 -1)) d)))))
X! 	((eq (car-safe x) 'polar)
X  	 (math-polar (math-tan-raw (math-complex x))))
X  	(t
X  	 (let ((sc (math-sin-cos-raw x)))
X--- 13954,13963 ----
X  	   (and (not (eq (nth 1 d) 0))
X  		(list 'cplx
X  		      (math-div-float (car sc) d)
X! 		      (math-div-float (math-mul-float (math-sub-float expx
X! 								      expmx)
X  						      '(float 5 -1)) d)))))
X! 	((eq (car x) 'polar)
X  	 (math-polar (math-tan-raw (math-complex x))))
X  	(t
X  	 (let ((sc (math-sin-cos-raw x)))
X***************
X*** 9476,9483 ****
X  
X  (defun math-arcsin-raw (x)   ; [N N]
X    (let ((a (math-sqrt-raw (math-sub '(float 1 0) (math-sqr x)))))
X!     (if (or (memq (car-safe x) '(cplx polar))
X! 	    (memq (car-safe a) '(cplx polar)))
X  	(math-with-extra-prec 2   ; use extra precision for difficult case
X  	  (math-mul '(cplx 0 -1)
X  		    (math-ln-raw (math-add (math-mul '(cplx 0 1) x) a))))
X--- 14066,14073 ----
X  
X  (defun math-arcsin-raw (x)   ; [N N]
X    (let ((a (math-sqrt-raw (math-sub '(float 1 0) (math-sqr x)))))
X!     (if (or (memq (car x) '(cplx polar))
X! 	    (memq (car a) '(cplx polar)))
X  	(math-with-extra-prec 2   ; use extra precision for difficult case
X  	  (math-mul '(cplx 0 -1)
X  		    (math-ln-raw (math-add (math-mul '(cplx 0 1) x) a))))
X***************
X*** 9489,9495 ****
X  )
X  
X  (defun math-arctan-raw (x)   ; [N N]
X!   (cond ((memq (car-safe x) '(cplx polar))
X  	 (math-with-extra-prec 2   ; extra-extra
X  	   (math-mul '(cplx 0 -1)
X  		     (math-ln-raw (math-mul
X--- 14079,14085 ----
X  )
X  
X  (defun math-arctan-raw (x)   ; [N N]
X!   (cond ((memq (car x) '(cplx polar))
X  	 (math-with-extra-prec 2   ; extra-extra
X  	   (math-mul '(cplx 0 -1)
X  		     (math-ln-raw (math-mul
X***************
X*** 9643,9653 ****
X  (defun math-exp-series (sum nfac n xpow x)
X    (math-working "exp" sum)
X    (let* ((nextx (math-mul-float xpow x))
X! 	  (nextsum (math-add-float sum (math-div-float nextx
X! 						       (math-float nfac)))))
X!      (if (math-nearly-equal-float sum nextsum)
X! 	 sum
X!        (math-exp-series nextsum (math-mul nfac n) (1+ n) nextx x)))
X  )
X  
X  
X--- 14233,14243 ----
X  (defun math-exp-series (sum nfac n xpow x)
X    (math-working "exp" sum)
X    (let* ((nextx (math-mul-float xpow x))
X! 	 (nextsum (math-add-float sum (math-div-float nextx
X! 						      (math-float nfac)))))
X!     (if (math-nearly-equal-float sum nextsum)
X! 	sum
X!       (math-exp-series nextsum (math-mul nfac n) (1+ n) nextx x)))
X  )
X  
X  
X***************
X*** 9677,9683 ****
X  (fset 'calcFunc-ln (symbol-function 'math-ln))
X  
X  (defun math-log10 (x)   ; [N N] [Public]
X!   (cond ((Math-numberp x)
X  	 (math-with-extra-prec 2
X  	   (let ((xf (math-float x)))
X  	     (if (eq (nth 1 xf) 0)
X--- 14267,14288 ----
X  (fset 'calcFunc-ln (symbol-function 'math-ln))
X  
X  (defun math-log10 (x)   ; [N N] [Public]
X!   (cond ((math-equal-int x 1)
X! 	 (if (math-floatp x) '(float 0 0) 0))
X! 	((and (Math-integerp x)
X! 	      (math-posp x)
X! 	      (let ((res (math-integer-log x 10)))
X! 		(and (car res)
X! 		     (setq x (cdr res)))))
X! 	 x)
X! 	((and (eq (car-safe x) 'frac)
X! 	      (eq (nth 1 x) 1)
X! 	      (let ((res (math-integer-log (nth 2 x) 10)))
X! 		(and (car res)
X! 		     (setq x (- (cdr res))))))
X! 	 x)
X! 	(calc-symbolic-mode (signal 'inexact-result nil))
X! 	((Math-numberp x)
X  	 (math-with-extra-prec 2
X  	   (let ((xf (math-float x)))
X  	     (if (eq (nth 1 xf) 0)
X***************
X*** 9718,9723 ****
X--- 14323,14352 ----
X  	 (math-reject-arg x "Logarithm of zero"))
X  	((math-zerop b)
X  	 (math-reject-arg b "Logarithm of zero"))
X+ 	((math-equal-int b 1)
X+ 	 (math-reject-arg b "Logarithm base one"))
X+ 	((math-equal-int x 1)
X+ 	 (if (or (math-floatp a) (math-floatp b)) '(float 0 0) 0))
X+ 	((and (Math-ratp x) (Math-ratp b)
X+ 	      (math-posp x) (math-posp b)
X+ 	      (let* ((sign 1) (inv nil)
X+ 		     (xx (if (math-lessp 1 x)
X+ 			     x
X+ 			   (setq sign -1)
X+ 			   (math-div 1 x)))
X+ 		     (bb (if (math-lessp 1 b)
X+ 			     b
X+ 			   (setq sign (- sign))
X+ 			   (math-div 1 b)))
X+ 		     (res (if (math-lessp xx bb)
X+ 			      (setq inv (math-integer-log bb xx))
X+ 			    (math-integer-log xx bb))))
X+ 		(and (car res)
X+ 		     (setq x (if inv
X+ 				 (math-div 1 (* sign (cdr res)))
X+ 			       (* sign (cdr res)))))))
X+ 	 x)
X+ 	(calc-symbolic-mode (signal 'inexact-result nil))
X  	((and (Math-numberp x) (Math-numberp b))
X  	 (math-with-extra-prec 2
X  	   (math-div (math-ln-raw (math-float x))
X***************
X*** 9749,9755 ****
X  	  (math-log x b)))
X      (math-normalize (list 'calcFunc-ln x)))
X  )
X! (defun calcFunc-ilog (x &optional b)
X    (if b
X        (if (equal b '(var e var-e))
X  	  (math-normalize (list 'calcFunc-exp x))
X--- 14378,14384 ----
X  	  (math-log x b)))
X      (math-normalize (list 'calcFunc-ln x)))
X  )
X! (defun calcFunc-alog (x &optional b)
X    (if b
X        (if (equal b '(var e var-e))
X  	  (math-normalize (list 'calcFunc-exp x))
X***************
X*** 9757,9762 ****
X--- 14386,14425 ----
X      (math-normalize (list 'calcFunc-exp x)))
X  )
X  
X+ (defun calcFunc-ilog (x b)
X+   (or (math-num-integerp x) (math-reject-arg x 'integerp))
X+   (or (math-num-integerp b) (math-reject-arg b 'integerp))
X+   (setq x (math-trunc x))
X+   (setq b (math-trunc b))
X+   (or (math-posp x) (math-reject-arg x 'posp))
X+   (or (math-posp b) (math-reject-arg b 'posp))
X+   (if (eq b 1) (math-reject-arg x "Logarithm of zero"))
X+   (if (Math-natnum-lessp x b)
X+       0
X+     (cdr (math-integer-log x b)))
X+ )
X+ 
X+ (defun math-integer-log (x b)
X+   (let ((pows (list b))
X+ 	(pow (math-sqr b))
X+ 	next
X+ 	sum n)
X+     (while (not (math-lessp x pow))
X+       (setq pows (cons pow pows)
X+ 	    pow (math-sqr pow)))
X+     (setq n (lsh 1 (1- (length pows)))
X+ 	  sum n
X+ 	  pow (car pows))
X+     (while (and (setq pows (cdr pows))
X+ 		(math-lessp pow x))
X+       (setq n (/ n 2)
X+ 	    next (math-mul pow (car pows)))
X+       (or (math-lessp x next)
X+ 	  (setq pow next
X+ 		sum (+ sum n))))
X+     (cons (equal pow x) sum))
X+ )
X+ 
X  
X  (defun math-log-base-raw (b)   ; [N N]
X    (if (not (and (equal (car math-log-base-cache) b)
X***************
X*** 10036,10041 ****
X--- 14699,15504 ----
X  
X  
X  
X+ ;;;; [calc-funcs.el]
X+ 
X+ ;;; Sources:  Numerical Recipes, Press et al;
X+ ;;;           Handbook of Mathematical Functions, Abramowitz & Stegun.
X+ 
X+ 
X+ ;;; Gamma function.
X+ 
X+ (defun calcFunc-gamma (x)
X+   (or (math-numberp x) (math-reject-arg x 'numberp))
X+   (calcFunc-fact (math-add x -1))
X+ )
X+ 
X+ (defun math-gammap1-raw (x fprec nfprec)   ; compute gamma(1 + x)
X+   (cond ((math-lessp-float (math-real-part x) fprec)
X+ 	 (if (math-lessp-float (math-real-part x) nfprec)
X+ 	     (math-neg (math-div
X+ 			(math-pi)
X+ 			(math-mul (math-gammap1-raw
X+ 				   (math-add (math-neg x)
X+ 					     '(float -1 0))
X+ 				   fprec nfprec)
X+ 				  (math-sin-raw
X+ 				   (math-mul (math-pi) x)))))
X+ 	   (let ((xplus1 (math-add x '(float 1 0))))
X+ 	     (math-div (math-gammap1-raw xplus1 fprec nfprec) xplus1))))
X+ 	(t   ; re(x) now >= 10.0
X+ 	 (let ((xinv (math-div 1 x))
X+ 	       (lnx (math-ln-raw x)))
X+ 	   (math-mul (math-sqrt-two-pi)
X+ 		     (math-exp-raw
X+ 		      (math-gamma-series
X+ 		       (math-sub (math-mul (math-add x '(float 5 -1))
X+ 					   lnx)
X+ 				 x)
X+ 		       xinv
X+ 		       (math-sqr xinv)
X+ 		       '(float 0 0)
X+ 		       2))))))
X+ )
X+ 
X+ (defun math-gamma-series (sum x xinvsqr oterm n)
X+   (math-working "gamma" sum)
X+   (let* ((bn (math-bernoulli-number n))
X+ 	 (term (math-mul (math-div-float (math-float (nth 1 bn))
X+ 					 (math-float (* (nth 2 bn)
X+ 							(* n (1- n)))))
X+ 			 x))
X+ 	 (next (math-add sum term)))
X+     (if (math-nearly-equal sum next)
X+ 	next
X+       (if (> n (* 2 calc-internal-prec))
X+ 	  (progn
X+ 	    ;; Need this because series eventually diverges for large enough n.
X+ 	    (calc-record-why "Gamma computation stopped early, not all digits may be valid")
X+ 	    next)
X+ 	(math-gamma-series next (math-mul x xinvsqr) xinvsqr term (+ n 2)))))
X+ )
X+ 
X+ 
X+ ;;; Incomplete gamma function.
X+ 
X+ (defun calcFunc-gammaP (a x)
X+   (math-inexact-result)
X+   (or (Math-numberp a) (math-reject-arg a 'numberp))
X+   (or (math-numberp x) (math-reject-arg x 'numberp))
X+   (if (and (math-num-integerp a)
X+ 	   (integerp (setq a (math-trunc a)))
X+ 	   (> a 0) (< a 20))
X+       (math-sub 1 (calcFunc-gammaQ a x))
X+     (let ((math-current-gamma-value (calcFunc-gamma a)))
X+       (math-div (calcFunc-gammag a x) math-current-gamma-value)))
X+ )
X+ 
X+ (defun calcFunc-gammaQ (a x)
X+   (math-inexact-result)
X+   (or (Math-numberp a) (math-reject-arg a 'numberp))
X+   (or (math-numberp x) (math-reject-arg x 'numberp))
X+   (if (and (math-num-integerp a)
X+ 	   (integerp (setq a (math-trunc a)))
X+ 	   (> a 0) (< a 20))
X+       (let ((n 0)
X+ 	    (sum '(float 1 0))
X+ 	    (term '(float 1 0)))
X+ 	(math-with-extra-prec 1
X+ 	  (while (< (setq n (1+ n)) a)
X+ 	    (setq term (math-div (math-mul term x) n)
X+ 		  sum (math-add sum term))
X+ 	    (math-working "gamma" sum))
X+ 	  (math-mul sum (math-exp (math-neg x)))))
X+     (let ((math-current-gamma-value (calcFunc-gamma a)))
X+       (math-div (calcFunc-gammaG a x) math-current-gamma-value)))
X+ )
X+ 
X+ (defun calcFunc-gammag (a x)
X+   (math-inexact-result)
X+   (or (Math-numberp a) (math-reject-arg a 'numberp))
X+   (or (Math-numberp x) (math-reject-arg x 'numberp))
X+   (math-with-extra-prec 2
X+     (setq a (math-float a))
X+     (setq x (math-float x))
X+     (if (or (math-negp (math-real-part a))
X+ 	    (math-lessp-float (math-real-part x)
X+ 			      (math-add-float (math-real-part a)
X+ 					      '(float 1 0))))
X+ 	(math-inc-gamma-series a x)
X+       (math-sub (or math-current-gamma-value (calcFunc-gamma a))
X+ 		(math-inc-gamma-cfrac a x))))
X+ )
X+ (setq math-current-gamma-value nil)
X+ 
X+ (defun calcFunc-gammaG (a x)
X+   (math-inexact-result)
X+   (or (Math-numberp a) (math-reject-arg a 'numberp))
X+   (or (Math-numberp x) (math-reject-arg x 'numberp))
X+   (math-with-extra-prec 2
X+     (setq a (math-float a))
X+     (setq x (math-float x))
X+     (if (or (math-negp (math-real-part a))
X+ 	    (math-lessp-float (math-real-part x)
X+ 			      (math-add-float (math-abs-approx a)
X+ 					      '(float 1 0))))
X+ 	(math-sub (or math-current-gamma-value (calcFunc-gamma a))
X+ 		  (math-inc-gamma-series a x))
X+       (math-inc-gamma-cfrac a x)))
X+ )
X+ 
X+ (defun math-inc-gamma-series (a x)
X+   (math-mul (math-exp-raw (math-sub (math-mul a (math-ln-raw x)) x))
X+ 	    (math-with-extra-prec 2
X+ 	      (let ((start (math-div '(float 1 0) a)))
X+ 		(math-inc-gamma-series-step start start a x))))
X+ )
X+ 
X+ (defun math-inc-gamma-series-step (sum term a x)
X+   (math-working "gamma" sum)
X+   (setq a (math-add a '(float 1 0))
X+ 	term (math-div (math-mul term x) a))
X+   (let ((next (math-add sum term)))
X+     (if (math-nearly-equal sum next)
X+ 	next
X+       (math-inc-gamma-series-step next term a x)))
X+ )
X+ 
X+ (defun math-inc-gamma-cfrac (a x)
X+   (math-mul (math-exp-raw (math-sub (math-mul a (math-ln-raw x)) x))
X+ 	    (math-inc-gamma-cfrac-step '(float 1 0) x '(float 0 0) '(float 1 0)
X+ 				       '(float 1 0) '(float 1 0) '(float 0 0)
X+ 				       a x))
X+ )
X+ 
X+ (defun math-inc-gamma-cfrac-step (a0 a1 b0 b1 n fac g a x)
X+   (let ((ana (math-sub n a))
X+ 	(anf (math-mul n fac)))
X+     (setq n (math-add n '(float 1 0))
X+ 	  a0 (math-mul (math-add a1 (math-mul a0 ana)) fac)
X+ 	  b0 (math-mul (math-add b1 (math-mul b0 ana)) fac)
X+ 	  a1 (math-add (math-mul x a0) (math-mul anf a1))
X+ 	  b1 (math-add (math-mul x b0) (math-mul anf b1)))
X+     (if (math-zerop a1)
X+ 	(math-inc-gamma-cfrac-step a0 a1 b0 b1 n fac g a x)
X+       (setq fac (math-div '(float 1 0) a1))
X+       (let ((next (math-mul b1 fac)))
X+ 	(math-working "gamma" next)
X+ 	(if (math-nearly-equal next g)
X+ 	    next
X+ 	  (math-inc-gamma-cfrac-step a0 a1 b0 b1 n fac next a x)))))
X+ )
X+ 
X+ 
X+ ;;; Error function.
X+ 
X+ (defun calcFunc-erf (x)
X+   (let ((math-current-gamma-value (math-sqrt-pi)))
X+     (math-to-same-complex-quad
X+      (math-div (calcFunc-gammag '(float 5 -1)
X+ 				(math-sqr (math-to-complex-quad-one x)))
X+ 	       math-current-gamma-value)
X+      x))
X+ )
X+ 
X+ (defun calcFunc-erfc (x)
X+   (if (math-posp x)
X+       (let ((math-current-gamma-value (math-sqrt-pi)))
X+ 	(math-div (calcFunc-gammaG '(float 5 -1) (math-sqr x))
X+ 		  math-current-gamma-value))
X+     (math-add '(float 1 0) (calcFunc-erf (math-neg x))))
X+ )
X+ 
X+ (defun math-to-complex-quad-one (x)
X+   (if (eq (car-safe x) 'polar) (setq x (math-complex x)))
X+   (if (eq (car-safe x) 'cplx)
X+       (list 'cplx (math-abs (nth 1 x)) (math-abs (nth 2 x)))
X+     x)
X+ )
X+ 
X+ (defun math-to-same-complex-quad (x y)
X+   (if (eq (car-safe y) 'cplx)
X+       (if (eq (car-safe x) 'cplx)
X+ 	  (list 'cplx
X+ 		(if (math-negp (nth 1 y)) (math-neg (nth 1 x)) (nth 1 x))
X+ 		(if (math-negp (nth 2 y)) (math-neg (nth 2 x)) (nth 2 x)))
X+ 	(if (math-negp (nth 1 y)) (math-neg x) x))
X+     (if (math-negp y)
X+ 	(if (eq (car-safe x) 'cplx)
X+ 	    (list 'cplx (math-neg (nth 1 x)) (nth 2 x))
X+ 	  (math-neg x))
X+       x))
X+ )
X+ 
X+ 
X+ ;;; Beta function.
X+ 
X+ (defun calcFunc-beta (a b)
X+   (if (math-num-integerp a)
X+       (let ((am (math-add a -1)))
X+ 	(or (math-numberp b) (math-reject-arg b 'numberp))
X+ 	(math-div 1 (math-mul b (math-choose (math-add b am) am))))
X+     (if (math-num-integerp b)
X+ 	(calcFunc-beta b a)
X+       (math-div (math-mul (calcFunc-gamma a) (calcFunc-gamma b))
X+ 		(calcFunc-gamma (math-add a b)))))
X+ )
X+ 
X+ 
X+ ;;; Incomplete beta function.
X+ 
X+ (defun calcFunc-betaI (x a b)
X+   (cond ((math-zerop x)
X+ 	 '(float 0 0))
X+ 	((math-equal-int x 1)
X+ 	 '(float 1 0))
X+ 	((or (math-zerop a)
X+ 	     (and (math-num-integerp a)
X+ 		  (math-negp a)))
X+ 	 (if (or (math-zerop b)
X+ 		 (and (math-num-integerp b)
X+ 		      (math-negp b)))
X+ 	     (math-reject-arg b 'nonzerop)
X+ 	   '(float 1 0)))
X+ 	((or (math-zerop b)
X+ 	     (and (math-num-integerp b)
X+ 		  (math-negp b)))
X+ 	 '(float 0 0))
X+ 	((not (math-numberp a)) (math-reject-arg a 'numberp))
X+ 	((not (math-numberp b)) (math-reject-arg b 'numberp))
X+ 	((math-inexact-result))
X+ 	(t (let ((math-current-beta-value (calcFunc-beta a b)))
X+ 	     (math-div (calcFunc-betaB x a b) math-current-beta-value))))
X+ )
X+ 
X+ (defun calcFunc-betaB (x a b)
X+   (cond
X+    ((math-zerop x)
X+     '(float 0 0))
X+    ((math-equal-int x 1)
X+     (calcFunc-beta a b))
X+    ((not (math-numberp x)) (math-reject-arg x 'numberp))
X+    ((not (math-numberp a)) (math-reject-arg a 'numberp))
X+    ((not (math-numberp b)) (math-reject-arg b 'numberp))
X+    ((math-zerop a) (math-reject-arg a 'nonzerop))
X+    ((math-zerop b) (math-reject-arg b 'nonzerop))
X+    ((and (math-num-integerp b)
X+ 	 (if (math-negp b)
X+ 	     (math-reject-arg b 'range)
X+ 	   (Math-natnum-lessp (setq b (math-trunc b)) 20)))
X+     (and calc-symbolic-mode (or (math-floatp a) (math-floatp b))
X+ 	 (math-inexact-result))
X+     (math-mul
X+      (math-with-extra-prec 2
X+        (let* ((i 0)
X+ 	      (term 1)
X+ 	      (sum (math-div term a)))
X+ 	 (while (< (setq i (1+ i)) b)
X+ 	   (setq term (math-mul (math-div (math-mul term (- i b)) i) x)
X+ 		 sum (math-add sum (math-div term (math-add a i))))
X+ 	   (math-working "beta" sum))
X+ 	 sum))
X+      (math-pow x a)))
X+    ((and (math-num-integerp a)
X+ 	 (if (math-negp a)
X+ 	     (math-reject-arg a 'range)
X+ 	   (Math-natnum-lessp (setq a (math-trunc a)) 20)))
X+     (math-sub (or math-current-beta-value (calcFunc-beta a b))
X+ 	      (calcFunc-betaB (math-sub 1 x) b a)))
X+    (t
X+     (math-inexact-result)
X+     (math-with-extra-prec 2
X+       (setq x (math-float x))
X+       (setq a (math-float a))
X+       (setq b (math-float b))
X+       (let ((bt (math-exp-raw (math-add (math-mul a (math-ln-raw x))
X+ 					(math-mul b (math-ln-raw
X+ 						     (math-sub '(float 1 0)
X+ 							       x)))))))
X+ 	(if (math-lessp x (math-div (math-add a '(float 1 0))
X+ 				    (math-add (math-add a b) '(float 2 0))))
X+ 	    (math-div (math-mul bt (math-beta-cfrac a b x)) a)
X+ 	  (math-sub (or math-current-beta-value (calcFunc-beta a b))
X+ 		    (math-div (math-mul bt
X+ 					(math-beta-cfrac b a (math-sub 1 x)))
X+ 			      b)))))))
X+ )
X+ (setq math-current-beta-value nil)
X+ 
X+ (defun math-beta-cfrac (a b x)
X+   (let ((qab (math-add a b))
X+ 	(qap (math-add a '(float 1 0)))
X+ 	(qam (math-add a '(float -1 0))))
X+     (math-beta-cfrac-step '(float 1 0)
X+ 			  (math-sub '(float 1 0)
X+ 				    (math-div (math-mul qab x) qap))
X+ 			  '(float 1 0) '(float 1 0)
X+ 			  '(float 1 0)
X+ 			  qab qap qam a b x))
X+ )
X+ 
X+ (defun math-beta-cfrac-step (az bz am bm m qab qap qam a b x)
X+   (let* ((two-m (math-mul m '(float 2 0)))
X+ 	 (d (math-div (math-mul (math-mul (math-sub b m) m) x)
X+ 		      (math-mul (math-add qam two-m) (math-add a two-m))))
X+ 	 (ap (math-add az (math-mul d am)))
X+ 	 (bp (math-add bz (math-mul d bm)))
X+ 	 (d2 (math-neg
X+ 	      (math-div (math-mul (math-mul (math-add a m) (math-add qab m)) x)
X+ 			(math-mul (math-add qap two-m) (math-add a two-m)))))
X+ 	 (app (math-add ap (math-mul d2 az)))
X+ 	 (bpp (math-add bp (math-mul d2 bz)))
X+ 	 (next (math-div app bpp)))
X+     (math-working "beta" next)
X+     (if (math-nearly-equal next az)
X+ 	next
X+       (math-beta-cfrac-step next '(float 1 0)
X+ 			    (math-div ap bpp) (math-div bp bpp)
X+ 			    (math-add m '(float 1 0))
X+ 			    qab qap qam a b x)))
X+ )
X+ 
X+ 
X+ ;;; Bessel functions.
X+ 
X+ ;;; Should generalize this to handle arbitrary precision!
X+ 
X+ (defun calcFunc-besJ (v x)
X+   (or (math-numberp v) (math-reject-arg v 'numberp))
X+   (or (math-numberp x) (math-reject-arg x 'numberp))
X+   (let ((calc-internal-prec (min 8 calc-internal-prec)))
X+     (math-with-extra-prec 3
X+       (setq x (math-float (math-normalize x)))
X+       (setq v (math-float (math-normalize v)))
X+       (cond ((math-zerop x)
X+ 	     (if (math-zerop v)
X+ 		 '(float 1 0)
X+ 	       '(float 0 0)))
X+ 	    ((math-inexact-result))
X+ 	    ((not (math-num-integerp v))
X+ 	     (let ((start (math-div 1 (calcFunc-fact v))))
X+ 	       (math-mul (math-besJ-series start start
X+ 					   0
X+ 					   (math-mul '(float -25 -2)
X+ 						     (math-sqr x))
X+ 					   v)
X+ 			 (math-pow (math-div x 2) v))))
X+ 	    ((math-negp (setq v (math-trunc v)))
X+ 	     (if (math-oddp v)
X+ 		 (math-neg (calcFunc-besJ (math-neg v) x))
X+ 	       (calcFunc-besJ (math-neg v) x)))
X+ 	    ((eq v 0)
X+ 	     (math-besJ0 x))
X+ 	    ((eq v 1)
X+ 	     (math-besJ1 x))
X+ 	    ((math-lessp v (math-abs-approx x))
X+ 	     (let ((j 0)
X+ 		   (bjm (math-besJ0 x))
X+ 		   (bj (math-besJ1 x))
X+ 		   (two-over-x (math-div 2 x))
X+ 		   bjp)
X+ 	       (while (< (setq j (1+ j)) v)
X+ 		 (setq bjp (math-sub (math-mul (math-mul j two-over-x) bj)
X+ 				     bjm)
X+ 		       bjm bj
X+ 		       bj bjp))
X+ 	       bj))
X+ 	    (t
X+ 	     (if (math-lessp 100 v) (math-reject-arg v 'range))
X+ 	     (let* ((j (logior (+ v (math-isqrt-small (* 40 v))) 1))
X+ 		    (two-over-x (math-div 2 x))
X+ 		    (jsum nil)
X+ 		    (bjp '(float 0 0))
X+ 		    (sum '(float 0 0))
X+ 		    (bj '(float 1 0))
X+ 		    bjm ans)
X+ 	       (while (> (setq j (1- j)) 0)
X+ 		 (setq bjm (math-sub (math-mul (math-mul j two-over-x) bj)
X+ 				     bjp)
X+ 		       bjp bj
X+ 		       bj bjm)
X+ 		 (if (> (nth 2 (math-abs-approx bj)) 10)
X+ 		     (setq bj (math-mul bj '(float 1 -10))
X+ 			   bjp (math-mul bjp '(float 1 -10))
X+ 			   ans (and ans (math-mul ans '(float 1 -10)))
X+ 			   sum (math-mul sum '(float 1 -10))))
X+ 		 (or (setq jsum (not jsum))
X+ 		     (setq sum (math-add sum bj)))
X+ 		 (if (= j v)
X+ 		     (setq ans bjp)))
X+ 	       (math-div ans (math-sub (math-mul 2 sum) bj)))))))
X+ )
X+ 
X+ (defun math-besJ-series (sum term k zz vk)
X+   (math-working "besJ" sum)
X+   (setq k (1+ k)
X+ 	vk (math-add 1 vk)
X+ 	term (math-div (math-mul term zz) (math-mul k vk)))
X+   (let ((next (math-add sum term)))
X+     (if (math-nearly-equal next sum)
X+ 	next
X+       (math-besJ-series next term k zz vk)))
X+ )
X+ 
X+ (defun math-besJ0 (x &optional yflag)
X+   (cond ((and (not yflag) (math-negp (math-real-part x)))
X+ 	 (math-besJ0 (math-neg x)))
X+ 	((math-lessp '(float 8 0) (math-abs-approx x))
X+ 	 (let* ((z (math-div '(float 8 0) x))
X+ 		(y (math-sqr z))
X+ 		(xx (math-add x '(float (bigneg 164 398 785) -9)))
X+ 		(a1 (math-poly-eval y
X+ 				    '((float (bigpos 211 887 093 2) -16)
X+ 				      (float (bigneg 639 370 073 2) -15)
X+ 				      (float (bigpos 407 510 734 2) -14)
X+ 				      (float (bigneg 627 628 098 1) -12)
X+ 				      (float 1 0))))
X+ 		(a2 (math-poly-eval y
X+ 				    '((float (bigneg 152 935 934) -16)
X+ 				      (float (bigpos 161 095 621 7) -16)
X+ 				      (float (bigneg 651 147 911 6) -15)
X+ 				      (float (bigpos 765 488 430 1) -13)
X+ 				      (float (bigneg 995 499 562 1) -11))))
X+ 		(sc (math-sin-cos-raw xx)))
X+ 	       (if yflag
X+ 		   (setq sc (cons (math-neg (cdr sc)) (car sc))))
X+ 	       (math-mul (math-sqrt
X+ 			  (math-div '(float (bigpos 722 619 636) -9) x))
X+ 			 (math-sub (math-mul (cdr sc) a1)
X+ 				   (math-mul (car sc) (math-mul z a2))))))
X+ 	 (t
X+ 	  (let ((y (math-sqr x)))
X+ 	    (math-div (math-poly-eval y
X+ 				      '((float (bigneg 456 052 849 1) -7)
X+ 					(float (bigpos 017 233 739 7) -5)
X+ 					(float (bigneg 418 442 121 1) -2)
X+ 					(float (bigpos 407 196 516 6) -1)
X+ 					(float (bigneg 354 590 362 13) 0)
X+ 					(float (bigpos 574 490 568 57) 0)))
X+ 		      (math-poly-eval y
X+ 				      '((float 1 0)
X+ 					(float (bigpos 712 532 678 2) -7)
X+ 					(float (bigpos 853 264 927 5) -5)
X+ 					(float (bigpos 718 680 494 9) -3)
X+ 					(float (bigpos 985 532 029 1) 0)
X+ 					(float (bigpos 411 490 568 57) 0)))))))
X+ )
X+ 
X+ (defun math-besJ1 (x &optional yflag)
X+   (cond ((and (math-negp (math-real-part x)) (not yflag))
X+ 	 (math-neg (math-besJ1 (math-neg x))))
X+ 	((math-lessp '(float 8 0) (math-abs-approx x))
X+ 	 (let* ((z (math-div '(float 8 0) x))
X+ 		(y (math-sqr z))
X+ 		(xx (math-add x '(float (bigneg 491 194 356 2) -9)))
X+ 		(a1 (math-poly-eval y
X+ 				    '((float (bigneg 019 337 240) -15)
X+ 				      (float (bigpos 174 520 457 2) -15)
X+ 				      (float (bigneg 496 396 516 3) -14)
X+ 				      (float 183105 -8)
X+ 				      (float 1 0))))
X+ 		(a2 (math-poly-eval y
X+ 				    '((float (bigpos 412 787 105) -15)
X+ 				      (float (bigneg 987 228 88) -14)
X+ 				      (float (bigpos 096 199 449 8) -15)
X+ 				      (float (bigneg 873 690 002 2) -13)
X+ 				      (float (bigpos 995 499 687 4) -11))))
X+ 		(sc (math-sin-cos-raw xx)))
X+ 	   (if yflag
X+ 	       (setq sc (cons (math-neg (cdr sc)) (car sc)))
X+ 	     (if (math-negp x)
X+ 		 (setq sc (cons (math-neg (car sc)) (math-neg (cdr sc))))))
X+ 	   (math-mul (math-sqrt (math-div '(float (bigpos 722 619 636) -9) x))
X+ 		     (math-sub (math-mul (cdr sc) a1)
X+ 			       (math-mul (car sc) (math-mul z a2))))))
X+ 	(t
X+ 	 (let ((y (math-sqr x)))
X+ 	   (math-mul
X+ 	    x
X+ 	    (math-div (math-poly-eval y
X+ 				      '((float (bigneg 606 036 016 3) -8)
X+ 					(float (bigpos 826 044 157) -4)
X+ 					(float (bigneg 439 611 972 2) -3)
X+ 					(float (bigpos 531 968 423 2) -1)
X+ 					(float (bigneg 235 059 895 7) 0)
X+ 					(float (bigpos 232 614 362 72) 0)))
X+ 		      (math-poly-eval y
X+ 				      '((float 1 0)
X+ 					(float (bigpos 397 991 769 3) -7)
X+ 					(float (bigpos 394 743 944 9) -5)
X+ 					(float (bigpos 474 330 858 1) -2)
X+ 					(float (bigpos 178 535 300 2) 0)
X+ 					(float (bigpos 442 228 725 144)
X+ 					       0))))))))
X+ )
X+ 
X+ (defun calcFunc-besY (v x)
X+   (math-inexact-result)
X+   (or (math-numberp v) (math-reject-arg v 'numberp))
X+   (or (math-numberp x) (math-reject-arg x 'numberp))
X+   (let ((calc-internal-prec (min 8 calc-internal-prec)))
X+     (math-with-extra-prec 3
X+       (setq x (math-float (math-normalize x)))
X+       (setq v (math-float (math-normalize v)))
X+       (cond ((not (math-num-integerp v))
X+ 	     (let ((sc (math-sin-cos-raw (math-mul v (math-pi)))))
X+ 	       (math-div (math-sub (math-mul (calcFunc-besJ v x) (cdr sc))
X+ 				   (calcFunc-besJ (math-neg v) x))
X+ 			 (car sc))))
X+ 	    ((math-negp (setq v (math-trunc v)))
X+ 	     (if (math-oddp v)
X+ 		 (math-neg (calcFunc-besY (math-neg v) x))
X+ 	       (calcFunc-besY (math-neg v) x)))
X+ 	    ((eq v 0)
X+ 	     (math-besY0 x))
X+ 	    ((eq v 1)
X+ 	     (math-besY1 x))
X+ 	    (t
X+ 	     (let ((j 0)
X+ 		   (bym (math-besY0 x))
X+ 		   (by (math-besY1 x))
X+ 		   (two-over-x (math-div 2 x))
X+ 		   byp)
X+ 	       (while (< (setq j (1+ j)) v)
X+ 		 (setq byp (math-sub (math-mul (math-mul j two-over-x) by)
X+ 				     bym)
X+ 		       bym by
X+ 		       by byp))
X+ 	       by)))))
X+ )
X+ 
X+ (defun math-besY0 (x)
X+   (cond ((math-lessp (math-abs-approx x) '(float 8 0))
X+ 	 (let ((y (math-sqr x)))
X+ 	   (math-add
X+ 	    (math-div (math-poly-eval y
X+ 				      '((float (bigpos 733 622 284 2) -7)
X+ 					(float (bigneg 757 792 632 8) -5)
X+ 					(float (bigpos 129 988 087 1) -2)
X+ 					(float (bigneg 036 598 123 5) -1)
X+ 					(float (bigpos 065 834 062 7) 0)
X+ 					(float (bigneg 389 821 957 2) 0)))
X+ 		      (math-poly-eval y
X+ 				      '((float 1 0)
X+ 					(float (bigpos 244 030 261 2) -7)
X+ 					(float (bigpos 647 472 474) -4)
X+ 					(float (bigpos 438 466 189 7) -3)
X+ 					(float (bigpos 648 499 452 7) -1)
X+ 					(float (bigpos 269 544 076 40) 0))))
X+ 	    (math-mul '(float (bigpos 772 619 636) -9)
X+ 		      (math-mul (math-besJ0 x) (math-ln-raw x))))))
X+ 	((math-negp (math-real-part x))
X+ 	 (math-add (math-besJ0 (math-neg x) t)
X+ 		   (math-mul '(cplx 0 2)
X+ 			     (math-besJ0 (math-neg x)))))
X+ 	(t
X+ 	 (math-besJ0 x t)))
X+ )
X+ 
X+ (defun math-besY1 (x)
X+   (cond ((math-lessp (math-abs-approx x) '(float 8 0))
X+ 	 (let ((y (math-sqr x)))
X+ 	   (math-add
X+ 	    (math-mul
X+ 	     x
X+ 	     (math-div (math-poly-eval y
X+ 				       '((float (bigpos 935 937 511 8) -6)
X+ 					 (float (bigneg 726 922 237 4) -3)
X+ 					 (float (bigpos 551 264 349 7) -1)
X+ 					 (float (bigneg 139 438 153 5) 1)
X+ 					 (float (bigpos 439 527 127) 4)
X+ 					 (float (bigneg 943 604 900 4) 3)))
X+ 		       (math-poly-eval y
X+ 				       '((float 1 0)
X+ 					 (float (bigpos 885 632 549 3) -7)
X+ 					 (float (bigpos 605 042 102) -3)
X+ 					 (float (bigpos 002 904 245 2) -2)
X+ 					 (float (bigpos 367 650 733 3) 0)
X+ 					 (float (bigpos 664 419 244 4) 2)
X+ 					 (float (bigpos 057 958 249) 5)))))
X+ 	    (math-mul '(float (bigpos 772 619 636) -9)
X+ 		      (math-sub (math-mul (math-besJ1 x) (math-ln-raw x))
X+ 				(math-div 1 x))))))
X+ 	((math-negp (math-real-part x))
X+ 	 (math-neg
X+ 	  (math-add (math-besJ1 (math-neg x) t)
X+ 		    (math-mul '(cplx 0 2)
X+ 			      (math-besJ1 (math-neg x))))))
X+ 	(t
X+ 	 (math-besJ1 x t)))
X+ )
X+ 
X+ (defun math-poly-eval (x coefs)
X+   (let ((accum (car coefs)))
X+     (while (setq coefs (cdr coefs))
X+       (setq accum (math-add (car coefs) (math-mul accum x))))
X+     accum)
X+ )
X+ 
X+ 
X+ ;;;; Bernoulli and Euler polynomials and numbers.
X+ 
X+ (defun calcFunc-bern (n &optional x)
X+   (if (and x (not (math-zerop x)))
X+       (if (and calc-symbolic-mode (math-floatp x))
X+ 	  (math-inexact-result)
X+ 	(math-build-polynomial-expr (math-bernoulli-coefs n) x))
X+     (or (math-num-natnump n) (math-reject-arg n 'natnump))
X+     (if (consp n)
X+ 	(progn
X+ 	  (math-inexact-result)
X+ 	  (math-float (math-bernoulli-number (math-trunc n))))
SHAR_EOF
echo "End of part 8, continue with part 9"
echo "9" > s2_seq_.tmp
exit 0



More information about the Comp.sources.misc mailing list