Ho scritto una funzione denominata analyze_the_shape
che accetta un elenco di vertici 2D in modo tale che l'elenco sia nell'ordine di una traversata in senso orario dei vertici nello spazio euclideo 2D.Perché ottengo ValueError: errore del dominio matematico?
Io lo chiamo nell'interprete e fornisco [(0, 0), (0, 4.0), (4.0, 4.0), (4.0, 0)]
come input ma ottengo ValueError : math domain error
. Mi aspetto di vedere return ["SQUARE", 4.0]
. Cosa posso fare ?
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]
Questo è l'errore che ottengo:
>>> 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 (angolo - 90,0) <0,001' e' abs (cos_angle + 1) <0,001' non significano lo stesso. Se 'angle = 90',' cos_angle = 0'. Se 'cos_angle = -1',' angle = 180'. –
Buona cattura! Penso che ci sia un errore in cui l'OP imposta 'cos_angle' - L'ho indicato nella mia risposta. –
"il modo in cui Python memorizza' cos_angle' non è perfetto ". Questo dovrebbe "il modo in cui i numeri in virgola mobile sono rappresentati su un computer non è perfetto, e quindi gli errori di calcolo sono inevitabili". Python non ha assolutamente nulla a che fare con questo. – Bakuriu