"Dave Angel" <da...@davea.name> wrote in message
On 02/21/2013 02:33 PM, Schizoid Man wrote:
However, there is an important inaccuracy in math.pow, because it uses floats to do the work. If you have very large integers, that means some of them won't be correct. The following are some examples for 2.7.3 on Linux:

 a  b  math.pow(a,b)       a**b
 3 34 1.66771816997e+16 16677181699666569
 3 35 5.0031545099e+16 50031545098999707
...
 5 23 1.19209289551e+16 11920928955078125

The built-in pow, on the other hand, seems to get identical answers for all these cases. So use pow() instead of math.pow()

I see. I thought using the ** was shorthand for math.pow() and didn't think that one would be integer operations and the other floats. I'm performing some large integer arithmetic operations. I would normally do this my writing my own multiplication class and storing results as strings, but a friend suggested that I look at Python.

I ran this one example and was quite surprised at the difference, since 9183 is the correct answer.

One other test:

diff = set(map(int, result1)).symmetric_difference(set(result2))
if diff:
    print diff
    print len(diff)

shows me a diff set of 15656 members.  One such member:

13552527156068805425093160010874271392822265625000000000000000000000000000000000000000000000000000000000000000000L

Notice how using floats truncated lots of the digits in the value?

I'm running this test now, but the Mac's fan has kicked in (it's a slightly older machine) so might it let run through the night.

I appreciate the help.

--
DaveA

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to