[Python-ideas] Approximately equal operator

Steven D'Aprano steve at pearwood.info
Sat Jun 16 06:51:30 EDT 2018

On Fri, Jun 15, 2018 at 05:31:57PM -0700, Nathaniel Smith wrote:
> On Fri, Jun 15, 2018 at 3:56 PM, Andre Roberge <andre.roberge at gmail.com> wrote:
> > * people doing heavy numerical work and wanting code as readable as possible
> IME serious numerical work doesn't use approximate equality tests at
> all, except in test assertions.

I wouldn't go that far. It is quite common to write

    abs(x - y) < e

or similar, to see whether x and y are within a certain distance of each 
other. APL even made their equals operator an "approximate equality" 
operator. So I don't think it is completely crazy to want an operator 
for this. But I think that falls short of "a good idea for Python".

> > * teaching mostly beginners about finite precision for floating point
> > arithmetics
> Given that approximate equality tests are almost never the right
> solution, I would be worried that emphasizing them to beginners would
> send them down the wrong path. This is already a common source of
> confusion and trap for non-experts.

Certainly it is an area that is rife with superstitition, like the idea 
that you should "never" compare two floats for equality, or folklore 
about what tolerance you should use.


> > * people wishing to have trigonometric functions with arguments in degrees,
> > as in a current discussion on this forum.
> AFAICT approximate equality checks aren't really useful for that, no.

Indeed. The last thing a maths library should be doing is making 
arbitrary choices that some value is "close enough" and return "the 
value we think you want".

"Hi, the number you gave is pretty close to 60°, so I'm going to round 
the answer off whether you want me to or not."

Its okay for people to make their own determination what "close enough" 
means, and for many purposes 0.99 could be close enough to 1. But the 
library shouldn't.

> Python is *very* stingy with adding new operators; IIRC only 3 have
> been added over the last ~30 years (**, //, @). I don't think ~= is
> going to make it.

Exponentiation ** goes back to Python 1.5, so I think that's only two 
new operators :-)


More information about the Python-ideas mailing list