[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Elisp manual, node "Comparison of Numbers"

From: Stefan Monnier
Subject: Re: Elisp manual, node "Comparison of Numbers"
Date: Mon, 29 May 2006 15:23:00 -0400
User-agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux)

> I blindly got bit by this one.  The Elisp manual gives this as an example
> of how to test near equality of floating-point numbers:

>   (defvar fuzz-factor 1.0e-6)
>   (defun approx-equal (x y)
>     (or (and (= x 0) (= y 0))
>         (< (/ (abs (- x y))
>               (max (abs x) (abs y)))
>            fuzz-factor)))

> When either x or y is 0.0, but not both, this gives nil no matter how close
> the other number is to zero. I think this is more like what is needed:

>   (defun approx-equal (x y &optional fuzz)
>     (setq fuzz (or fuzz 1.0e-8))
>     (cond ((= x 0.0) (< y fuzz))
>           ((= y 0.0) (< x fuzz))
>           (t (< (/ (abs (- x y)) (max (abs x) (abs y))) fuzz))))

There is no generally good solution to this problem.  Depending on the
specific problem, one approach will work while that approach will fail
miserably in another context.

Welcome to the wonderful world of floating point and numerical analysis.

I don't think the Elisp manual should try to tackle these kinds of problems,
especially given how rarely floats are used in Emacs.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]