> From: "Drew Adams" <[EMAIL PROTECTED]>
> Date: Fri, 24 Jun 2005 12:33:53 -0700
> 
>     (condition-case nil (setq foo (/ 0.0 0.0)) (arith-error nil))
>     In older versions of Emacs (at least prior to April 2005 CVS), 
>     this would evaluate to nil. Now, it evaluates to -0.0NaN.
>     I can modify the code like so:
>     (and (condition-case nil (setq foo (/ 0.0 0.0)) (arith-error nil))
>          (bar foo)) ; foo must be a number, not a NaN
>     What function do I use for bar? 
>     `numberp' doesn't work, since (numberp -0.0NaN) is non-nil. 
> 
> To make the point simpler:
> 
> (numberp (/0.0 0.0)) returns t. That seems like a bug to me.

Maybe it is, maybe it isn't.  (elisp)Arithmetic Operations says:

     If you divide an integer by 0, an `arith-error' error is signaled.
     (*Note Errors::.)  Floating point division by zero returns either
     infinity or a NaN if your machine supports IEEE floating point;
     otherwise, it signals an `arith-error' error.

So if the machine supports IEEE floating point (most modern machines
do), you aren't supposed to get `arith-error' in this case.  Maybe
this is a bit counter-intuitive for someone who never did futz with
NaNs, but at least Emacs behaves consistently with the docs.

As for a way to test for a NaN, try this:

       (= (/ 0.0 0.0) (/ 0.0 0.0))

It should evaluate to nil, since a NaN is defined to fail _any_
arithmetic comparison, even a comparison to itself.


_______________________________________________
Emacs-devel mailing list
Emacs-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-devel

Reply via email to