My goal is to input the coordinates of the vertices of a triangle and have 
significant properties printed for a human to read.
I'm aware of the limitation of floating point arithmetic, and I was able to 
produce an accurate area with the decimal module.

return (sp*(sp-a)*(sp-b)*(sp-c)).sqrt().quantize(dec('1.0000000000'))

However, a version using sympy is also desirable. Do I need to install 
mpmath / gmpy to compensate for the floating point errors?
Here is the test code:

import sympy.functions as sym
import sympy.geometry as geo

sqrt = sym.sqrt

def distance(A, B):
 """
 A & B are objects with x and y attributes
 :return: the distance between A and B
 """
 dx = B.x - A.x
 dy = B.y - A.y
 return sqrt(dx**2 + dy**2)

def sides(A, B, C):
 """
 A, B & C are objects with x and y attributes
 :return: sorted side lengths (smallest to largest)
 """
 a = distance(B, C)
 b = distance(A, C)
 c = distance(A, B)
 return sorted((a, b, c,), key=float)

def area(a, b, c):
 """
 a, b & c are the side lengths of the trigon
 :return: area of the trigon
 """
 p = a + b + c # perimeter
 sp = p / 2 # semi-perimeter
 return sqrt(sp*(sp-a)*(sp-b)*(sp-c))

if __name__ == '__main__':
 p = geo.Point
 A = p(0, 0)
 B = p(3, 0)
 C = p(3, 3)
 sides = sides(A,B,C)
 print(sides)
 print(area(*sides))

Output: 

[3, 3, 3*sqrt(2)]
sqrt(-3*sqrt(2)/2 + 3)*sqrt(27*sqrt(2)/4 + 27/2)

Obviously I want 9/2 as the result for the area... but it is giving me a 
representation of 4.4999999999...
What can I do about this?

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sympy.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sympy/f0e6480a-f56d-43c7-a07d-883c97103834%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to