Scott David Daniels Scott.Daniels at Acm.Org
Wed Feb 4 14:52:11 EST 2009

Tim Rowe wrote:
> I'm reading Mark Summerfield's "Programming Python 3.0" at the moment,
> and I'm puzzled by some of his uses of sys.float_info.epsilon. I
> appreciate the issues of comparing floating point numbers, but I'm
> puzzled by code like:
>     ...
>     x = float(input(msg))
>     if abs(x) < sys.float_info.epsilon:
>         ...
> What could the float() conversion return that would give different results for:
>     if abs(x) < sys.float_info.epsilon
> and (to my mind, more obvious):
>     if abs(x) == 0.0
> I didn't realise that float() could return anything with an absolute
> value less than sys.float_value.epsilon other than 0.0 (which I think
> all representations can represent exactly).  What am I missing here?

You are missing the whole thing that mes floating point tricky.
I _believe_ that the epsilon is the smallest positive x such that
    1.0 != 1.0 + x
That doesn't mean that x is the smallest representable. for example,
    .0125 + epsilon / 4 != .0125

To avoid using epsilon, do something like:
     if 1 + abs(x) != 1:

To learn a bit more, look into numerical analysis -- there is a whole
field dedicated to figuring out how to make floating point behave a
little bit like real numbers.  The reason it is tough is that addition
is not associative in real numbers, and associativity is at the core
of a lot of proofs in arithmetic (and group theory).

--Scott David Daniels
Scott.Daniels at Acm.Org

More information about the Python-list mailing list