Short-circuit Logic

Steven D'Aprano steve+comp.lang.python at pearwood.info
Thu May 30 01:10:49 EDT 2013


On Wed, 29 May 2013 07:27:40 -0700, Ahmed Abdulshafy wrote:

> On Tuesday, May 28, 2013 3:48:17 PM UTC+2, Steven D'Aprano wrote:
>> On Mon, 27 May 2013 13:11:28 -0700, Ahmed Abdulshafy wrote:
>> 
>> 
>> 
>> > That may be true for integers, but for floats, testing for equality
>> > is
>> 
>> > not always precise
>> 
>> 
>> 
>> Incorrect. Testing for equality is always precise, and exact. The
>> problem
>> 
>> is not the *equality test*, but that you don't always have the number
>> 
>> that you think you have. The problem lies elsewhere, not equality!
>> 
>> 
>> Steven
> 
> Well, this is taken from my python shell>
> 
>>>> 0.33455857352426283 == 0.33455857352426282
> True

This is an excellent example of misunderstanding what you are seeing. 
Both 0.33455857352426283 and 0.33455857352426282 represent the same 
float, so it is hardly a surprise that they compare equal -- they compare 
equal because they are equal.

py> a, b = 0.33455857352426283, 0.33455857352426282
py> a.as_integer_ratio()
(6026871468229899, 18014398509481984)
py> b.as_integer_ratio()
(6026871468229899, 18014398509481984)

You've made a common error: neglecting to take into account the finite 
precision of floats. Floats are not mathematical "real numbers", with 
infinite precision. The error is more obvious if we exaggerate it:

py> 0.3 == 0.300000000000000000000000000000000000000000000000000001
True

Most people who have seen an ordinary four-function calculator will 
realise that the issue here is *not* that the equality operator == is 
wrongly stating that two unequal numbers are equal, but that just because 
you enter 0.300...00001 doesn't mean that all those decimal places are 
actually used.


> Anyway, man, those were not my words anyway, most programming books I've
> read state so. Here's an excerpt from the Python book, I'm currently
> reading>
> 
> ">>> 0.0, 5.4, -2.5, 8.9e-4
> (0.0, 5.4000000000000004, -2.5, 0.00088999999999999995)
> 
> 
> The inexactness is not a problem specific to Python—all programming
> languages have this problem with floating-point numbers."

I'm not denying that floats are tricky to use correctly, or that testing 
for exact equality is *sometimes* the wrong thing to do:

# Wrong, don't do this!
x = 0.1
while x != 17.3:
    print(x)
    x += 0.1


I'm just saying that a simple minded comparison with 
sys.float_info.epsilon is *also* often wrong.


-- 
Steven



More information about the Python-list mailing list