sign(exp(2009)) --> floating point overflow



In sign1, I see some code that looks broken. I commented it out and
then sign(exp(2009)) --> pos. I'm not claiming that a good fix is to
comment out this code--it's just a place I might start looking. Also,
the signbfloat scheme is fundamentally broken.

(defun sign1 (x)
  (setq x (specrepcheck x))
  (setq x (infsimp* x))
  (when (and *complexsign* (atom x) (eq x '$infinity))
    ;; In Complex Mode the sign of infinity is complex.
    (when *debug-compar* (format t "~& in sign1 detect $infintiy.~%"))
    (return-from sign1 '$complex))
  (if (member x '($und $ind $infinity) :test #'eq)
      (if limitp '$pnz (merror (intl:gettext "sign: sign of ~:M is
      undefined.") x)))
  (prog (dum exp)
     (setq dum (constp x) exp x)
     (cond ((or (numberp x) (ratnump x)))
    ((eq dum 'bigfloat)
     (if (prog2 (setq dum ($bfloat x)) ($bfloatp dum))
  (setq exp dum)))
    ((eq dum 'float)
     (if (and (setq dum (numer x)) (numberp dum)) (setq exp dum)))
    ((and (member dum '(numer symbol) :test #'eq) ;; <---- looks bogus to
    me (especially the (< (abs dum) 1.0e-6))
   (prog2 (setq dum (numer x))
       (or (null dum)
    (and (numberp dum)
         (prog2 (setq exp dum)
      (< (abs dum) 1.0e-6)))))) ;; <---- surely this is bogus.
     (cond ($signbfloat
     (and (setq dum ($bfloat x)) ($bfloatp dum) (setq exp dum)))
    (t (setq sign '$pnz evens nil odds (ncons x) minus nil)
       (return sign)))))
     (or (and (not (atom x)) (not (mnump x)) (equal x exp)
       (let (s o e m lhs rhs)
  (compsplt x)
  (dcompare lhs rhs)
  (cond ((member sign '($pos $neg $zero) :test #'eq))
        ((eq sign '$pnz) nil)
        (t (setq s sign o odds e evens m minus)
    (sign x)
    (if (not (strongp sign s))
        (if (and (eq sign '$pnz) (eq s '$pn))
     (setq sign s)
     (setq sign s odds o evens e minus m)))
    t))))
  (sign exp))
     (return sign)))
Barton

-----maxima-bounces at math.utexas.edu wrote: -----

>To:?Richard?Fateman?<fateman at cs.berkeley.edu>
>From:?Stavros?Macrakis?<macrakis at alum.mit.edu>
>Sent?by:?maxima-bounces at math.utexas.edu
>Date:?10/17/2009?04:06PM
>cc:?maxima at math.utexas.edu,?Barton?Willis?<willisb at unk.edu>
>Subject:?Re:?[Maxima]?sign(exp(2009))?-->?floating?point?overflow
>
>On?Sat,?Oct?17,?2009?at?4:43?PM,?Richard?Fateman?<fateman at cs.berkeley.edu>
>wrote:
>
>This?problem?is?somewhere?between?"?not?worth?fixing"?and?"too?hard?to
>
>solve?in?general".
>
>
>
>exp(2009)?is?about?1.5e871,?which?is?too?big?for?a?float.
>
>There's?no?reason?sign?needs?to?convert?exp(...)?to?a?float?to?determine
>that?it's?positive,?since?exp(x)?is?positive?for?all?real?x.??Of?course,
>if?you?have?sign(exp(2009)?-?tan(%pi/2-10^-870)),?it's?harder?to?avoid
>numerics....
>
>
>...but?not?impossible.??taylor(exp(a)-tan(%pi/2-10^-(k*a),a,inf,0)?lets
>you?approximate?the?crossover?pretty?closely?as?k=1/log(10)?for?large?a.
>And?you?can?calculate?the?error?term?as?well.??But?no?point?in?going?into
>details?here.
>
>
>???????????????-s
>
>_______________________________________________
>Maxima?mailing?list
>Maxima at math.utexas.edu
>http://www.math.utexas.edu/mailman/listinfo/maxima