tags:

views:

85

answers:

3

Hi

Level: Beginner

In the following code my 'samePoint' function returns False where i am expecting True. Any hints?

import math

class cPoint:
    def __init__(self,x,y):
        self.x = x
        self.y = y
        self.radius = math.sqrt(self.x*self.x + self.y*self.y)
        self.angle = math.atan2(self.y,self.x)
    def cartesian(self):
        return (self.x, self.y)
    def polar(self):
        return (self.radius, self.angle)

class pPoint:
    def __init__(self,r,a):
        self.radius = r
        self.angle = a
        self.x = r * math.cos(a)
        self.y = r * math.sin(a)
    def cartesian(self):
        return (self.x, self.y)
    def polar(self):
        return (self.radius, self.angle)

def samePoint(p, q):
    return (p.cartesian == q.cartesian)

>>> p = cPoint(1.0000000000000002, 2.0)
>>> q = pPoint(2.23606797749979, 1.1071487177940904)
>>> p.cartesian()
(1.0000000000000002, 2.0)
>>> q.cartesian()
(1.0000000000000002, 2.0)
>>> samePoint(p, q)
False
>>> 

source: MIT OpenCourseWare http://ocw.mit.edu Introduction to Computer Science and Programming Fall 2008

+4  A: 

You are not calling the methods on the equal check. So you are comparing the methods to each othter.

Try:

 return (p.cartesian() == q.cartesian())
TheCandyMan666
thanks CandyMan!
Baba
+6  A: 

Looking at your code

def samePoint(p, q):
    return (p.cartesian == q.cartesian)

p.cartesian, q.cartesian are functions and you are comparing function rather than function result. Since the comparing two distinct functions, the result is False

What you should have been coding is

def samePoint(p, q):
    return (p.cartesian() == q.cartesian())
pyfunc
Hi pyfunc, thank you for your help! it seems i made a simple mistake but it will me help get the basics right. Much appreciated!
Baba
+1  A: 

After you get the function calling thing fixed, you'll have floating point issues.

try,

def is_same_point(p1, p2, e):
    for c1, c2 in zip(c1, c2):
       if abs(c1 - c2) > e:
          return False
    return True

I'm really surprised that it's working out for you with the code sample you posted. You must have constructed it to do so. In general, you can't directly compare floating point values for equality.

A more pythonic way to write the above function is

def is_same_point(point1, point2, e):
    return not any(abs(c1 - c2) > e for c1, c2 in zip(point1, point2))

you still have to pass the e (for epsilon) around though and that's gonna get old fast.

def make_point_tester(e):
    def is_same_point(point1, point2):
        return not any(abs(c1 - c2) > e for c1, c2 in zip(point1, point2))
    return is_same_point

is_same_point = make_point_tester(.001)

You've allready run into functions being first class objects, so you shouldn't have any trouble with this code ;)

aaronasterling
It must have worked for him so far because he didn't have the case of the same FP value reached by different paths (i.e. comparing 5.1 to 3.0+2.1)
Eli Bendersky