( 이 방법을 이전에 테스트했지만 올바르게 작동했지만이 질문에 대해 구체적으로 테스트하지는 않았습니다. )
지금까지 내가 말할 수있는, 모두 와 그들은 거의 평행하는 경우 중 하나를 입력이 꺼져있는 경우 / 수직 - ATAN2 당신에게 좋은 정확성을 제공 할 수없는 치명적인 취소 고생 할 수 있습니다.∥v1×v2∥v1⋅v2
측면 길이가 삼각형의 각도를 찾음으로써 문제를 재구성하는 것으로 시작하십시오. ,및(이들은 모두 부동 소수점 산술로 정확하게 계산됩니다). 잘 알려진 변형있다 헤론의 공식 인해 Kahan (로 잘못 계산 영역과 바늘 형상의 각도 삼각형 는 (사이의 영역 및 각도를 산출 할 수 있도록), 와 의 측면 길이에 의해 특정 된 삼각형)을, 수치 적으로 안정적으로 수행하십시오. 이 하위 문제의 감소도 정확하기 때문에이 방법은 임의의 입력에 적합합니다.a=|v1|b=|v2|c=|v1−v2|ab
가정 (P.3 참조) 즉 종이 인용 ,
여기에있는 모든 괄호는주의해서 배치되며 중요합니다. 음수의 제곱근을 취하면 입력 측 길이는 삼각형의 측 길이가 아닙니다.a≥b
μ=⎧⎩⎨c−(a−b),b−(a−c),invalid triangle,if b≥c≥0,if c>b≥0,otherwise
angle=2arctan(((a−b)+c)μ(a+(b+c))((a−c)+b)−−−−−−−−−−−−−−−−−−−−√)
Kahan의 논문에는 다른 수식이 실패하는 값의 예를 포함하여 이것이 어떻게 작동하는지에 대한 설명이 있습니다. 에 대한 귀하의 첫 번째 공식 있다 4 페이지.αC′′
Kahan 's Heron의 공식을 제안하는 주된 이유는 매우 멋진 기본 요소를 만들기 때문입니다. 잠재적으로 까다로운 평면 형상 질문을 임의의 삼각형의 면적 / 각도를 찾는 것으로 줄일 수 있기 때문에 문제를 줄일 수 있다면 그것에 대한 좋은 안정된 공식이며, 스스로 무언가를 생각 해낼 필요가 없습니다.
편집 Stefano의 의견에 따라 , ( code )에 대한 상대 오류 플롯을 작성했습니다 . 두 줄은 및 , 대한 상대 오류 가 가로 축을 따라 이동하는 것입니다. 작동하는 것 같습니다.
v1=(1,0)v2=(cosθ,sinθ)θ=ϵθ=π/2−ϵϵ