On 02/21/2013 05:44 PM, Schizoid Man wrote:
  <snip>


No, I was aware to be honest. I thought ** was just short hand for
math.pow(). Since ** is the integer operation

It's an integer operation because you started with two ints. Unlike math.pow, which converts to floats, whatever you feed it.


I compared the difference and got a large blob of numbers. To make a
proper comparison I'll need to compare the base and exponent for which
the numbers are different rather than the numbers themselves. I'm
following Dave's suggestion of determining the symmetric difference of
the sets.

But once you have a few that are just plain way off, it doesn't really matter whether some others differ in the 17th place. All the other discussion is interesting, but don't forget the main point, that trying to represent large integers (over 17 or so digits) as floats is going to lose precision. That can happen a number of ways, and math.pow is just one of them.

Floats use a finite precision to store their value, and the radix is binary, not decimal. So figuring where they start to lose precision is tricky. If you're doing a calculation where all intermediate values are integers, you're usually better off sticking with int/long.

There are many other kinds of constraints that come up in programming, and Python usually has an answer for each. But in a machine of finite size, and when we care at least a little about performance, we frequently have to pick our algorithm, our set of functions, and our data format carefully.

Someone else has mentioned the decimal package and the fractions. Each of those has a lot to offer in specific situations. But none is a panacea.


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

Reply via email to