From: Dieter K. <cra...@us...> - 2008-10-22 14:51:34
|
Update of /cvsroot/maxima/maxima/src In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv15306 Modified Files: csimp.lisp csimp2.lisp Log Message: Changing code of simpgamma: 1. Cut off early test against $gammalim 2. Add test against $factlim before calling mfactorial 3. Add test for postive integer which are greater than $factlim 4. Before calling gammared test against $gammalim Further changes: Reduce value of $gammalim to 10,000. Move $gammalim from csimp.lisp to csimp2.lisp. $gammalim is only used in csimp2.lisp Add $factlim to the declaration of special variables at the top of the file csimp2.lisp. Tested with CLISP 2.44 and GCL 2.6.8. No problems with the testsuite. Index: csimp.lisp =================================================================== RCS file: /cvsroot/maxima/maxima/src/csimp.lisp,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- csimp.lisp 19 Sep 2007 00:26:21 -0000 1.15 +++ csimp.lisp 22 Oct 2008 14:51:29 -0000 1.16 @@ -33,7 +33,7 @@ (defmvar %pi2 '((mtimes) 2 $%pi)) (defmvar half%pi3 '((mtimes) ((rat simp) 3 2) $%pi)) (defmvar $sumsplitfact t) ;= nil minfactorial is applied after a factocomb. -(defmvar $gammalim 1000000.) +;(defmvar $gammalim 1000000.) Moved to csimp2.lisp (loop for (a b) on '(%sin %asin %cos %acos %tan %atan Index: csimp2.lisp =================================================================== RCS file: /cvsroot/maxima/maxima/src/csimp2.lisp,v retrieving revision 1.30 retrieving revision 1.31 diff -u -d -r1.30 -r1.31 --- csimp2.lisp 21 Oct 2008 12:09:25 -0000 1.30 +++ csimp2.lisp 22 Oct 2008 14:51:29 -0000 1.31 @@ -14,7 +14,10 @@ (load-macsyma-macros rzmac) -(declare-top (special var %p%i varlist plogabs half%pi nn* dn*)) +(declare-top (special var %p%i varlist plogabs half%pi nn* dn* $factlim)) + +(defmvar $gammalim 10000 + "Controls simplification of gamma for rational number arguments.") (defvar $gamma_expand nil "Expand gamma(z+n) for n an integer when T.") @@ -191,7 +194,7 @@ (and (eq ($sign j) '$neg) (zerop1 (sub j ($truncate j)))))) (merror "gamma(~:M) is undefined." j)) - (($bfloatp j) + (($bfloatp j) ;; Adding 4 digits in the call to bffac. For $fpprec up to about 256 ;; and an argument up to about 500.0 the accuracy of the result is ;; better than 10^(-$fpprec). @@ -208,6 +211,7 @@ (add -1 ($bfloat ($realpart j)) (mul '$%i ($bfloat ($imagpart j)))) (+ $fpprec 4))) + ((eq j '$inf) '$inf) ; Simplify to $inf to be more consistent. ((and $gamma_expand (mplusp j) (integerp (cadr j))) @@ -225,17 +229,24 @@ ;; and not (1-z)*(2-z)*... ($factor (simplify (list '($pochhammer) (sub 1 z) n)))))))) - ((or (not (mnump j)) - (ratgreaterp (simplify (list '(mabs) j)) $gammalim)) - (eqtest (list '(%gamma) j) x)) ((integerp j) - (cond ((> j 0) (simplify (list '(mfactorial) (1- j)))) + (cond ((> j 0) + (cond ((<= j $factlim) + ;; Positive integer less than $factlim. Evaluate. + (simplify (list '(mfactorial) (1- j)))) + ;; Positive integer greater $factlim. Noun form. + (t (eqtest (list '(%gamma) j) x)))) + ;; Negative integer. Throw a Maxima error. (errorsw (throw 'errorsw t)) (t (merror "gamma(~:M) is undefined" j)))) ($numer (gammafloat (fpcofrat j))) ((alike1 j '((rat) 1 2)) (list '(mexpt simp) '$%pi j)) - ((or (ratgreaterp j 1) (ratgreaterp 0 j)) (gammared j)) + ((and (mnump j) + (ratgreaterp $gammalim (simplify (list '(mabs) j))) + (or (ratgreaterp j 1) (ratgreaterp 0 j))) + ;; Expand for rational numbers less than $gammalim. + (gammared j)) (t (eqtest (list '(%gamma) j) x))))) (defun gamma (y) ;;; numerical evaluation for 0 < y < 1 |