나는 삼각형에 대한 좌표 집합을 통해 실행되는 스크립트를 가지며 그것이 직각인지 아닌지를 결정합니다. 이 중 일부는 코사인 규칙을 사용하며 한 줄에 떨어지는 일련의 점을 확인할 때 문제가 발생했습니다. 여기에 문제의 원인이되는 부분이다 :math.acos 수학 영역 오차 범위 내에서 acos
s1 = math.sqrt(((x2-x1)**2)+((y2-y1)**2))
s2 = math.sqrt(((x3-x2)**2)+((y3-y2)**2))
s3 = math.sqrt(((x3-x1)**2)+((y3-y1)**2))
num1 = (s1**2)+(s2**2)-(s3**2)
den1 = (2)*(s1)*(s2)
theta1 = math.acos(num1/den1)
num2 = (s1**2)+(s3**2)-(s2**2)
den2 = (2)*(s1)*(s3)
theta2 = math.acos(num2/den2)
num3 = (s3**2)+(s2**2)-(s1**2)
den3 = (2)*(s3)*(s2)
theta3 = math.acos(num3/den3)
나는 3 점이를 통해 실행하면 ([0,0], [4,4], [1,1]), 나는 다음과 같은 오류가 발생합니다 :
Traceback (most recent call last):
File "./i091.py", line 79, in <module>
detect_right_triangle(xy1, xy2, xy3)
File "./i091.py", line 50, in detect_right_triangle
theta2 = math.acos(num2/den2)
ValueError: math domain error
그냥, 나는 그것이 평가 된 포인트의 모든 theta2의 분자와 분모를 인쇄했다, 그리고이 선도 일어나서 내가 코사인 함수의 경계의 외출되지 않았 음을 확인합니다 질문의 요지 :
***** [[0, 0], [4, 2], [1, 1]]
>>> num2 = 12.0
>>> den2 = 12.6491106407
***** [[0, 0], [4, 3], [1, 1]]
>>> num2 = 14.0
>>> den2 = 14.1421356237
***** [[0, 0], [4, 4], [1, 1]]
>>> num2 = 16.0
>>> den2 = 16.0
어떤 이유로 든 (16.0) 어떤 이유로 든 두 개의 숫자를 나누는 데 문제가 있다고 생각 했겠지만, 두 번째 점은 [2,2]와 [3,3]에서 잘 작동합니다.
... 여기에 잘못 갈 수있는 무엇에
***** [[0, 0], [3, 3], [1, 1]]
>>> num2 = 12.0
>>> den2 = 12.0
어떤 생각? 난 당신의 코드를 실행하면
내 생각에 부동 소수점 숫자는 반올림되고 비율은 사실 1.0 이상. – mdurant
반올림 오류를보기 위해 출력을 어떻게 확장 할 수 있는지 또는 어떻게 조정할 수 있는지 알고 계십니까? –
숫자가 정확한 결과를 얻었습니다. 문제가 그 번호 주변에 확실합니까? 그 숫자들로부터 수동으로 acos를 계산하려고 시도 했습니까? 스크립트에서 숫자 중 일부가 정수로 유지되지 않습니까? –