( ฉันได้ทดสอบวิธีการนี้มาก่อนและฉันจำได้ว่าทำงานได้อย่างถูกต้อง แต่ฉันไม่ได้ทดสอบวิธีนี้โดยเฉพาะสำหรับคำถามนี้ )
เท่าที่ฉันจะบอกได้ทั้ง และสามารถทนทุกข์ทรมานจากการยกเลิกหายนะหากพวกเขาเกือบขนาน / ตั้งฉากกัน - atan2 ไม่สามารถให้ความแม่นยำที่ดีถ้าอินพุตปิด∥v1×v2∥v1⋅v2
เริ่มต้นโดยปรับโครงสร้างปัญหาใหม่เพื่อหามุมของสามเหลี่ยมที่มีความยาวด้าน,และ(สิ่งเหล่านี้คำนวณได้อย่างแม่นยำในการคำนวณเลขทศนิยม) มีสูตรที่เป็นที่รู้จักกันดีของนกกระสาเนื่องจาก Kahan (การคำนวณพื้นที่และมุมของสามเหลี่ยมคล้ายเข็ม ) ซึ่งช่วยให้คุณคำนวณพื้นที่และมุม (ระหว่างและ ) ของรูปสามเหลี่ยมที่ระบุโดยความยาวด้าน และทำอย่างเสถียรเชิงตัวเลข เนื่องจากการลดลงของปัญหาย่อยนี้มีความถูกต้องเช่นกันวิธีการนี้ควรใช้กับอินพุตที่กำหนดเองa=|v1|b=|v2|c=|v1−v2|ab
การอ้างถึงจากกระดาษนั้น (ดูหน้า 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 Heron ก็คือเพราะมันเป็นสูตรดั้งเดิมที่ดีมาก - คำถามเรขาคณิตเชิงระนาบจำนวนมากอาจลดลงเพื่อหาพื้นที่ / มุมของสามเหลี่ยมโดยพลการดังนั้นถ้าคุณสามารถลดปัญหาของคุณได้นั่นคือ เป็นสูตรที่เสถียรดีและไม่จำเป็นต้องคิดอะไรขึ้นมาเอง
แก้ไขความคิดเห็นของสเตฟาโนฉันทำพล็อตข้อผิดพลาดแบบสัมพัทธ์สำหรับ , ( รหัส ) สองบรรทัดคือข้อผิดพลาดสัมพัทธ์สำหรับและ ,จะไปตามแกนนอน ดูเหมือนว่ามันใช้งานได้
v1=(1,0)v2=(cosθ,sinθ)θ=ϵθ=π/2−ϵϵ