Confusing math problem

Steven D'Aprano steve+comp.lang.python at pearwood.info
Fri Feb 22 10:27:20 CET 2013


On Thu, 21 Feb 2013 19:33:32 +0000, Schizoid Man wrote:

> Hi there,
> 
> I run the following code in Python 3.3.0 (on a Windows 7 machine) and
> Python 2.7.3 on a Mac and I get two different results:

Others have already explained that math.pow and the ** exponentiation 
operator are subtly different. However I wish to discuss your code:


> result1 = []
> result2 = []
> for a in range(2,101):
>     for b in range(2,101):
>         result1.append(math.pow(a,b))
>         result2.append(a**b)
> result1 = list(set(result1))
> result2 = list(set(result2))
> print (len(result1))
> print (len(result2))

This is more simply written as:

result1 = set()
result2 = set()
for a in range(2, 101):
    for b in range(2, 101):
        result1.add(a**b)
        result2.add(math.pow(a, b))

print(len(result1))
print(len(result2))

No need for the pointless conversion from list to set to list again, if 
all you want is the number of unique values.

More interesting is to gather the pairs of values that differ:

results = []
for a in range(2, 101):
    for b in range(2, 101):
        if a**b != math.pow(a, b): results.append((a, b))

You will see that integer exponentiation and floating point 
exponentiation are more frequently different than not.

(8105 of the calculations differ, 1696 of them are the same.)



-- 
Steven



More information about the Python-list mailing list