我寫了一個名爲analyze_the_shape
的函數,它取得了一個2D頂點列表,使得該列表按照二維歐幾里德空間中頂點的順時針遍歷順序排列。爲什麼我會得到ValueError:數學域錯誤?
我在口譯員稱它爲[(0, 0), (0, 4.0), (4.0, 4.0), (4.0, 0)]
作爲輸入,但我得到ValueError : math domain error
。我期望看到return ["SQUARE", 4.0]
。我能做什麼 ?
import math
def analyze_the_shape(liste):
if len(liste) == 2 :
d = ((liste[1][0] - liste[0][0])**2 + (liste[1][1] - liste[0][1])**2)**(0.5)
return ["LINESEGMENT", d ]
if len(liste) == 4 :
d1 = abs(((liste[1][0] - liste[0][0])**2 + (liste[1][1] - liste[0][1])**2)**(0.5))
d2 = abs(((liste[2][0] - liste[1][0])**2 + (liste[2][1] - liste[1][1])**2)**(0.5))
d3 = abs(((liste[3][0] - liste[2][0])**2 + (liste[3][1] - liste[2][1])**2)**(0.5))
d4 = abs(((liste[0][0] - liste[3][0])**2 + (liste[0][1] - liste[3][1])**2)**(0.5))
hypo = abs(((liste[2][1] - liste[0][1])**2 + (liste[2][0] - liste[0][0])**2)**(0.5))
cos_angle = float((hypo**2 - (d3)**2 + (d4)**2)/((-2.0)*(d4)*(d3)))
angle = math.degrees(math.acos(cos_angle))
if d1 == d2 == d3 == d4 and abs(angle - 90.0) < 0.001 :
return ["SQUARE", d1]
這是我的錯誤:
>>> import a
>>> a.analyze_the_shape([(0, 0), (0, 4.0), (4.0, 4.0), (4.0, 0)])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "a.py", line 15, in analyze_the_shape
ValueError: math domain error
'abs(angle-90.0)<0.001'和'abs(cos_angle + 1)<0.001'並不意味着相同。如果'angle = 90','cos_angle = 0'。如果'cos_angle = -1','angle = 180'。 –
好趕上!我認爲在OP設置「cos_angle」時出現錯誤 - 我在回答中指出了這一點。 –
「Python存儲'cos_angle'的方式並不完美」。這應該是「在計算機上表示浮點數的方式並不完美,因此計算錯誤是不可避免的」。 Python與此完全無關。 – Bakuriu