[Haskell-cafe] Re: A question about "monad laws"

ajb at spamcop.net ajb at spamcop.net
Thu Feb 14 18:06:33 EST 2008

G'day all.

Quoting Thorkil Naur <naur at post11.tele.dk>:

> Finding the "machine epsilon", perhaps, that is, the smallest   
> (floating point,
> surely) number for which 1.0+machine_eps==1.0 would be a candidate?

The machine epsilon is the smallest relative separation between two
adjacent normalised floating point numbers.  (The largest is the
machine epsilon multiplied by the radix, more or less.)

So as I understand it, if you're thinking relative error, this test:

     (fabs(x1-x2) < machine_eps * fabs(x1))

should be true if and only if x1 == x2, assuming that x1 and x2 are
nonzero and normalised.

I've always had the impression that using the machine epsilon for
pseudo-equality testing is fairly useless, especially if you can work
out a meaningful problem-specific tolerance.

What seems to be more useful is using the machine epsilon to compute an
estimate of how much relative error your algorithm accumulates.  I've
seen this in a lot of Serious Numeric Code(tm), and I've done it myself
(probably inexpertly) a few times.

I haven't tried this, but I imagine that a computed relative error
estimate could be useful for assisting your approximate-equality
tests under some circumstances.  Richard might know of some
circumstances where this sort of thing would be useful.

Andrew Bromage

More information about the Haskell-Cafe mailing list