> 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
[email protected]
http://lists.gnu.org/mailman/listinfo/emacs-devel