ปัญหานี้เกิดจากคำว่า "มีสภาพดี" มันเป็นปัญหาของการคำนวณทางคณิตศาสตร์ไม่ใช่คณิตศาสตร์
นี่คือข้อเท็จจริงพื้นฐานที่ควรพิจารณา:
หนึ่งเรเดียนบนพื้นโลกมีความยาวเกือบ 10 ^ 7 เมตร
ฟังก์ชันโคไซน์สำหรับอาร์กิวเมนต์xใกล้ 0 มีค่าประมาณเท่ากับ 1 - x ^ 2/2
ทศนิยมที่มีความแม่นยำสองเท่ามีความแม่นยำประมาณ 15 หลัก
คะแนน (2) และ (3) บอกเป็นนัยว่าเมื่อxประมาณหนึ่งเมตรหรือ 10 ^ -7 เรเดียน (จุด 1) ความแม่นยำเกือบทั้งหมดจะหายไป: 1 - (10 ^ -7) ^ 2 = 1 - 10 ^ - 14 คือการคำนวณที่ 14 หลักแรกของ 15 หลักสำคัญทั้งหมดยกเลิกโดยเหลือเพียงหนึ่งหลักเพื่อแสดงผลลัพธ์ พลิกสิ่งนี้ไปรอบ ๆ (ซึ่งเป็นสิ่งที่ตรงกันข้ามโคไซน์ "acos" ทำ) หมายความว่าการคำนวณ acos สำหรับมุมที่สอดคล้องกับระยะทางเมตรยาวไม่สามารถทำได้ด้วยความแม่นยำที่มีความหมายใด ๆ (ในบางกรณีที่ไม่ดีการสูญเสียความแม่นยำให้ค่าที่ไม่ได้กำหนด acos ดังนั้นโค้ดจะพังลงและไม่ให้คำตอบคำตอบไร้สาระหรือเครื่องขัดข้อง) ข้อควรพิจารณาที่คล้ายกันแนะนำให้คุณหลีกเลี่ยงการใช้ inverse cosine หากระยะทางน้อยกว่าสองสามร้อยเมตรขึ้นอยู่กับความแม่นยำที่คุณยินดีเสีย
บทบาทที่เล่นโดย acos ในสูตร law-of-cosines ที่ไร้เดียงสาคือการแปลงมุมเป็นระยะทาง บทบาทนั้นเล่นโดย atan2 ในสูตรแฮเวอรีน แทนเจนต์ของมุมเล็ก ๆxจะประมาณเท่ากับxตัวเอง ดังนั้นค่าผกผันแทนเจนต์ของตัวเลขจะอยู่ที่ประมาณนั้นโดยคำนวณโดยไม่มีการสูญเสียความแม่นยำ นี่คือเหตุผลว่าทำไมสูตรแฮเวอรีนถึงแม้ว่าคณิตศาสตร์จะเทียบเท่ากับกฎของโคไซน์สูตร แต่มันก็ยอดเยี่ยมสำหรับระยะทางขนาดเล็ก (ตามลำดับ 1 เมตรหรือน้อยกว่า)
นี่คือการเปรียบเทียบของสองสูตรโดยใช้ 100 จุดคู่แบบสุ่มบนโลก (โดยใช้การคำนวณความแม่นยำสองเท่าของ Mathematica)
คุณสามารถเห็นได้ว่าสำหรับระยะทางน้อยกว่า 0.5 เมตรสูตรทั้งสองแตกต่างกัน สูงกว่า 0.5 เมตรพวกเขามีแนวโน้มที่จะเห็นด้วย เพื่อแสดงให้เห็นว่าพวกเขาเห็นด้วยอย่างใกล้ชิดโครงเรื่องต่อไปจะแสดงอัตราส่วนของกฎของโคไซน์: ผลของแฮเวอร์ซีนสำหรับจุดสุ่มอีก 100 คู่โดยมีละติจูดและลองจิจูดยาวแตกต่างกันถึง 5 เมตร
นี่แสดงให้เห็นว่ากฎของโคไซน์สูตรดีถึงทศนิยม 3-4 ตำแหน่งเมื่อระยะทางเกิน 5-10 เมตร จำนวนตำแหน่งทศนิยมที่แม่นยำเพิ่มขึ้นเป็นสองเท่า ดังนั้นที่ 50-100 เมตร (หนึ่งคำสั่งของขนาด) คุณจะได้รับความถูกต้อง 5-6 dp (สองคำสั่งของขนาด); ที่ 500-1,000 เมตรคุณจะได้รับ 7-8 dp เป็นต้น