From 424b193be7f3350808cad097047a63685576b74f Mon Sep 17 00:00:00 2001 From: David Scherfgen Date: Fri, 21 Jun 2024 10:38:20 +0200 Subject: [PATCH] Fix bug #4317: "Maxima doesn't know that signum(real) can only be -1, 0 or +1" and add tests --- src/compar.lisp | 17 +++++++++++++++++ tests/rtest16.mac | 43 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/compar.lisp b/src/compar.lisp index 1c3af3685..9d9ebf22d 100644 --- a/src/compar.lisp +++ b/src/compar.lisp @@ -1489,6 +1489,23 @@ TDNEG TDZERO TDPN) to store it, and also sets SIGN." (setq sgn '$pz)) ((zerop1 (add xrhs -1)) ;; c = -1 (setq sgn '$nz)))) + + ;; sign(signum(x)+c) + (when (and (not (atom xlhs)) + (eq (caar xlhs) '%signum) + (zerop1 ($imagpart (cadr xlhs)))) + (cond ((eq (sign* (add xrhs 1)) '$neg) ;; c > 1 + (setq sgn '$pos)) + ((eq (sign* (add xrhs -1)) '$pos) ;; c < -1 + (setq sgn '$neg)) + ((zerop1 (add xrhs 1)) ;; c = 1 + (setq sgn '$pz)) + ((zerop1 (add xrhs -1)) ;; c = -1 + (setq sgn '$nz)) + ((zerop1 xrhs) ;; c = 0 (necessary?) + (setq sgn '$pnz)) + (t ;; -1 < c < 1, but c # 0 + (setq sgn '$pn)))) (when (and $useminmax (or (minmaxp xlhs) (minmaxp xrhs))) (setq sgn (signdiff-minmax xlhs xrhs))) diff --git a/tests/rtest16.mac b/tests/rtest16.mac index 9ddbe972e..b1586a5ca 100644 --- a/tests/rtest16.mac +++ b/tests/rtest16.mac @@ -2841,4 +2841,45 @@ closeto(float(li[2](%i))-(0.915965594177219*%i-0.20561675835602827), 1e-15); true; closeto(bfloat(li[2](%i))-(9.15965594177219015054603b-1*%i - 2.05616758356028304559052b-1), 10*10^(-fpprec)); -true; \ No newline at end of file +true; + +/* Bug #4317: "Maxima doesn't know that signum(real) can only be -1, 0 or +1" */ + +is(signum(x)<=1); +true; + +is(signum(x)>=-1); +true; + +is(signum(x)<2); +true; + +is(signum(x)>-2); +true; + +is(equal(signum(x),1)); +unknown; + +is(equal(signum(x),-1)); +unknown; + +is(equal(signum(x),0)); +unknown; + +is(equal(signum(x),1/2)); +false; + +is(equal(signum(x),-1/2)); +false; + +declare(x,complex); +done; + +is(signum(x)<=1); +unknown; + +is(signum(x)>=-1); +unknown; + +kill(x); +done; \ No newline at end of file -- 2.11.4.GIT