चाहे विन्सेन्टी या हैवरसाइन या कोसाइन के गोलाकार कानून का उपयोग कर रहे हों, किसी भी संभावित मुद्दों के बारे में जागरूक हो जाना चाहिए, जिस कोड के साथ आप उपयोग करने की योजना बना रहे हैं, चीजों को देखने और कम करने के लिए, और विन्सेंटी बनाम केविन्स के साथ कैसे डील करता है? भिन्न होगा क्योंकि प्रत्येक व्यक्ति के गुप्त मुद्दों / edgecases के बारे में पता चलता है, जो लोकप्रिय रूप से ज्ञात हो भी सकता है और नहीं भी। अनुभवी प्रोग्रामर यह जानता है। Newbies नहीं हो सकता है। मुझे आशा है कि उनमें से कुछ लोगों को निराशा होती है जब एक मंच से एक स्निपेट कुछ मामलों में कुछ अप्रत्याशित करता है। यदि कोई गंभीरता से इनमें से किसी भी संस्करण का उपयोग करने जा रहा है, विन्सेन्टी, हैवरसाइन, स्लोक, तो एसई, एसओ, रेडिट, क्वोरा, इत्यादि, किसी समाधान के कुछ प्रारंभिक कोडिंग में सीमित मदद प्रदान कर सकते हैं, लेकिन इसका मतलब यह नहीं है कि उनका समाधान या स्वीकृत 'उत्तर' मुद्दों से मुक्त है। यदि कोई परियोजना पर्याप्त महत्वपूर्ण है, तो यह उचित उचित मात्रा में अनुसंधान के योग्य है। मैन्युअल पढ़ें, डॉक्स पढ़ें, और यदि उस कोड की कोड समीक्षा मौजूद है, तो पढ़ें। एक स्निपेट या जिप को कॉपी करना और चिपकाना जो सौ या अधिक बार अपवित्र किया गया था, इसका मतलब यह नहीं है कि इसकी सुरक्षा व्यापक और आश्वस्त है।
Cffk द्वारा पोस्ट किया गया पेचीदा जवाब, पैकेज्ड सॉल्यूशंस में लुकिंग एडगैसेस के बारे में जागरूक होने के बिंदु को बढ़ाता है, जो अपवाद या अन्य कठिनाइयों का उत्पादन कर सकता है । उस पद पर किए गए विशिष्ट दावे वर्तमान में आगे बढ़ाने के लिए मेरे समय के बजट से परे हैं, लेकिन मैं इससे दूर हूं कि वास्तव में कुछ पैकेजों में गुप्त मुद्दे हैं, जिनमें कम से कम एक विनियोगी कार्यान्वयन शामिल है, जिसके बारे में कम से कम एक व्यक्ति ने सुधार करने का प्रस्ताव दिया है एक तरह से या किसी अन्य, उन कठिनाइयों का सामना करने के जोखिम को कम करने या समाप्त करने के लिए। मैं विन्सेन्टी के विषय में उस विषय को आगे नहीं जोड़ूंगा (अब तक इससे बहुत अनभिज्ञ होने के नाते), लेकिन ओवर्स के साथ कम से कम आंशिक रूप से विषय पर हावरसीन के बजाय बदल जाएगा।
लोकप्रिय रूप से प्रकाशित हैवरसाइन फार्मूला, चाहे अजगर या किसी अन्य भाषा में, क्योंकि यह आज सबसे अधिक सभी इंटेल और इंटेल जैसी प्रणालियों पर IEEE 754 फ्लोटिंग पॉइंट कल्पना का उपयोग करने वाला है, और एआरएम प्रोसेसर, पावरपीसी, आदि, यह जा रहा है। फ्लोटिंग पॉइंट सन्निकटन और गोलाई के कारण 180 डिग्री आर्क दूरी, एंटीपोडल बिंदुओं पर बहुत कम या वास्तविक और दोहरावदार अपवाद त्रुटियों के लिए भी अतिसंवेदनशील हो सकते हैं। हो सकता है कि इस स्थिति से कुछ नए लोगों को अभी तक काट नहीं लिया गया हो। चूँकि यह fp स्पेकट और राउंड का अनुमान लगाता है, इसका मतलब यह नहीं है कि fp64 पर कॉल करने वाला कोई भी कोड अपवाद त्रुटियों का कारण हो सकता है, नहीं। लेकिन कुछ कोड, कुछ फार्मूले इतने स्पष्ट edgecases नहीं हो सकते हैं जहां IEEE 754 fp64 के सन्निकटन और गोलाई एक मान को गणित विधि के डोमेन से थोड़ा बाहर भटकने का कारण हो सकता है जो इस तरह के मूल्य का त्रुटिपूर्ण मूल्यांकन करने की उम्मीद करता है। एक उदाहरण ... sqrt ()। यदि एक नकारात्मक मान एक sqrt (), जैसे sqrt (-0.00000000000000000122739) में अपना रास्ता खोजता है, तो एक अपवाद त्रुटि होगी। हावरसाइन सूत्र में, जिस तरह से यह एक समाधान की ओर बढ़ता है, एटान 2 () में दो sqrt () विधियां हैं। एक कि गणना की जाती है और फिर sqrt () में इस्तेमाल किया जा सकता है, दुनिया में एंटीपोडल बिंदुओं पर, 0.0 से नीचे या 1.0 से थोड़ा ऊपर, fp64 सन्निकटन और गोलाई के कारण बहुत कम, शायद ही कभी, लेकिन बार-बार। इस संदर्भ में लगातार विश्वसनीय पुनरावृत्ति, इसे एक अपवाद यादृच्छिक जोखिम के बजाय, एक अपवाद जोखिम, रक्षा करने के लिए, मिटाने के लिए एक edgecase बनाता है। यहां आवश्यक सुरक्षा के बिना, हावरसिन के एक छोटे अजगर 3 स्निपेट का एक उदाहरण दिया गया है:
import math as m
a = m.sin(dlat / 2)**2 + m.cos(lat1) * m.cos(lat2) * m.sin(dlon / 2)**2
c = 2 * m.atan2(m.sqrt(a), m.sqrt(1 - a))
distance = Radius * c
बहुत निकट या प्रतिमुख बिंदुओं पर, एक सूत्र की पहली पंक्ति में गणना की नकारात्मक भटक सकता है, शायद ही कभी, लेकिन repeatably उन्हीं अक्षां देशांतर निर्देशांकों के साथ। उन दुर्लभ घटनाओं की रक्षा / सुधार करने के लिए, एक गणना के बाद, बस जोड़ सकते हैं , जैसा कि नीचे देखा गया है:
import math as m
note = ''
a = m.sin(dlat / 2)**2 + m.cos(lat1) * m.cos(lat2) * m.sin(dlon / 2)**2
if a < 0.0: a = 0.0 ; note = '*'
if a > 1.0: a = 1.0 ; note = '**'
c = 2 * m.atan2(m.sqrt(a), m.sqrt(1 - a))
distance = Radius * c
# note = '*' # a went below 0.0 and was normalized back to 0.0
# note = '**' # a went above 1.0 and was normalized back to max of 1.0
बेशक मैंने यहां पूरा समारोह नहीं दिखाया था, लेकिन एक छोटा सा स्निपेट जैसा कि अक्सर पोस्ट किया जाता है। लेकिन यह एक ए का परीक्षण करके , और यदि आवश्यक हो तो इसे सामान्य करने के अलावा, एक प्रयास में पूरी बात डालने की आवश्यकता को बचाते हुए, sqrt () के लिए सुरक्षा दिखाता है । नोट = '' टॉप ऊपर है बाइटकोड चरण को विरोध करने से रोकने के लिए कि नोट को एक मान असाइन किए जाने से पहले उपयोग किया जा रहा है, अगर यह फ़ंक्शन के परिणाम के साथ लौटा है।
इस सरल परिवर्तन के साथ, दो को जोड़ने का एक परीक्षण, sqrt () फ़ंक्शन खुश हो जाएगा, और कोड अब एक अतिरिक्त है टिप्पणी है कि कोड बुला, चेतावनी है कि एक परिणाम के थोड़ा सामान्य कर दिया गया है, और क्यों करने के लिए वापस आ जा सकता है। कुछ देखभाल कर सकते हैं, कुछ नहीं कर सकते हैं, लेकिन वहाँ, एक अपवाद त्रुटि को रोकने, कि 'अन्यथा' हो सकता है। ब्लॉक को छोड़कर एक प्रयास अपवाद को पकड़ सकता है, लेकिन इसे ठीक न करें, जब तक कि स्पष्ट रूप से ऐसा करने के लिए नहीं लिखा गया हो। यह कोड सुधार लाइन (रों) के तुरंत बाद के लिए आसान लगता है एक गणना लाइन। पूरी तरह से रगड़ने वाले इनपुट को तब ब्लॉक की आवश्यकता नहीं होनी चाहिए, यहां ब्लॉक को छोड़कर।
सारांश, haversine का उपयोग कर अगर, बल्कि स्पष्ट रूप से कोडित एक पैकेज या लाइब्रेरी का उपयोग कर, और कोई चारा नहीं की अपनी भाषा में कोई फर्क से, यह परीक्षण करने के लिए एक अच्छा विचार होगा और सामान्य बनाने में एक क्रम में 0.0 की आवश्यक कार्रवाई रेंज में वापस <= एक <= 1.0 अपने सी गणना के साथ अगली पंक्ति की सुरक्षा के लिए । लेकिन हैवरसाइन कोड के अधिकांश स्निपेट्स इसे नहीं दिखाते हैं, और जोखिम का उल्लेख नहीं करते हैं।
अनुभव: दुनिया भर में पूरी तरह से परीक्षण के दौरान, 0.001 डिग्री वेतन वृद्धि में, मैंने लेट लोन संयोजनों के साथ एक हार्ड ड्राइव को भर दिया है, जो एक अपवाद के कारण, एक विश्वसनीय सुसंगत दोहराए जाने वाले अपवाद, एक महीने के दौरान सीपीयू शीतलन की विश्वसनीयता का परीक्षण करने के लिए। प्रशंसक, और मेरा धैर्य। हां, मैंने तब से अधिकांश लॉग को हटा दिया है, क्योंकि उनका उद्देश्य ज्यादातर बिंदु को साबित करने के लिए था (यदि सजा की अनुमति है)। लेकिन मेरे पास परीक्षण के उद्देश्यों के लिए रखे गए 'समस्या लाट लोन मूल्यों' के कुछ छोटे लॉग हैं।
शुद्धता: विल एक और पूरे haversine परिणाम यह है कि डोमेन में छोटे बिट वापस सामान्य से कुछ सटीकता खो? बहुत अधिक नहीं, शायद fp64 सन्निकटन और गोलाई से अधिक पहले से ही शुरू नहीं किया गया था, जिससे डोमेन से थोड़ा सा बहाव हुआ। यदि आपको पहले से ही विन्सेंटी के ऊपर हावरसीन स्वीकार्य है - सरल, तेज, अनुकूलित करना, समस्या निवारण और बनाए रखना आसान है, तो हैवरसाइन आपके प्रोजेक्ट के लिए एक अच्छा समाधान हो सकता है।
मैंने आकाश में वस्तुओं के बीच कोणीय दूरियों को मापने के लिए एक ओवरहेड प्रक्षेपित गगनचुंबी इमारत पर हैवरसाइन का उपयोग किया है, जैसा कि पृथ्वी पर स्थिति से देखा गया है, अजीमथ और अल्ट्स को स्काईस्फीयर लाट लोन समतुल्य जैसे निर्देशांक, सभी पर विचार करने के लिए कोई elipsoid नहीं। अनुमानित सैद्धांतिक गगनचुंबी इमारत एक आदर्श क्षेत्र है, जब यह पृथ्वी की सतह पर एक स्थिति से दो वस्तुओं के बीच कोणीय दूरी के कोण को मापने की बात आती है। यह मेरी जरूरतों पर पूरी तरह से खरा उतरता है। तो, हावरसीन अभी भी बहुत उपयोगी है, और बहुत सटीक है, कुछ अनुप्रयोगों में (अच्छी तरह से मेरे उद्देश्यों के भीतर) ... लेकिन अगर आप इसका उपयोग करते हैं, चाहे वह जीआईएस या नेविगेशन के लिए, या आकाश वस्तु टिप्पणियों और मापों के लिए पृथ्वी पर हो, तो रक्षा करें एंटीपोडल पॉइंट के मामले में या एंटीपोडल पॉइंट के पास, परीक्षण करकेऔर जरूरत पड़ने पर उसे वापस उसके जरूरतमंद डोमेन में डाल देना।
असुरक्षित haversine पूरे इंटरनेट पर है, और मैंने केवल एक पुरानी usenet पोस्ट देखी है जिसमें कुछ सुरक्षा दिखाई गई है, मुझे लगता है कि JPL में किसी से, और यह 1985 से पहले का हो सकता है, पूर्व IEEE 754 फ़्लोटिंग पॉइंट कल्पना। दो अन्य पृष्ठों में एंटीपोडल बिंदुओं के पास संभावित मुद्दों का उल्लेख किया गया है, लेकिन उन मुद्दों का वर्णन नहीं किया गया है, या कोई उन्हें कैसे कम कर सकता है। तो नए लोगों के लिए चिंता है (मेरे जैसे) जो हमेशा अच्छे अभ्यास को आगे के शोध के लिए अच्छी तरह से समझ नहीं सकते हैं, और edgecases का परीक्षण कर सकते हैं, कुछ कोड की उन्होंने ट्रस्ट में एक परियोजना में कॉपी और पेस्ट किया है। cffk का पेचीदा पोस्ट इस बात से ताज़ा था कि यह इस प्रकार के मुद्दों के साथ सार्वजनिक था, जिन्हें अक्सर उल्लेख नहीं किया जाता है, शायद ही कभी स्निपेट्स में सुरक्षा के लिए कोडित किया जाता है, और शायद ही कभी इस तरह से चर्चा की जाती है, जो कि पोस्ट किए गए असुरक्षित और अनदेखे संस्करणों की तुलना में है।
20190923 के अनुसार, हाइवराइन फॉर्मूला के लिए विकी पेज वास्तव में एंटीपोडल बिंदुओं पर समस्या का उल्लेख करता है, कंप्यूटिंग डिवाइसेस में फ्लोटिंग पॉइंट इश्यू के कारण ... उत्साहजनक ...
https://en.wikipedia.org/wiki/Haversine_formula
(क्योंकि वह विकी पेज इस समय नहीं है, उस अनुभाग के लिए एक html एंकर है जिसमें मैं सीधे लिंक करूँगा, इसलिए, पेज लोड होने के बाद, 'इन फ़ार्मुलों का उपयोग करते समय' के लिए उस ब्राउज़र पेज पर एक खोज करें और आप करेंगे एंटीपोडल बिंदुओं के साथ हैवेरिन की समस्या को देखें, अधिक आधिकारिक तौर पर।)
और इस अन्य साइट में इसका बहुत संक्षिप्त उल्लेख भी है:
https://www.movable-type.co.uk/scripts/latlong.html
यदि कोई उस पृष्ठ पर 'राउंडिंग त्रुटियों के विरुद्ध सुरक्षा सहित' के लिए खोज करता है, तो यह है ...
यदि atan2 उपलब्ध नहीं है, तो c की गणना 2 (asin (min (1, )a)) से की जा सकती है (गोलाई त्रुटियों के विरुद्ध सुरक्षा सहित)।
अब एक दुर्लभ उदाहरण है जहां राउंडिंग त्रुटियों का उल्लेख किया गया है, और असिन () संस्करण के लिए दिखाया गया संरक्षण, अभी तक उल्लेख नहीं किया गया है या एटैन 2 () संस्करण के लिए दिखाया गया है। लेकिन गोलाई त्रुटियों का कम से कम जोखिम का उल्लेख किया गया है।
Imho, किसी भी 24/7/365 आवेदन का उपयोग कर haversine, एक महत्वपूर्ण और सरल विस्तार के रूप में एंटीपोडल बिंदुओं के पास इस सुरक्षा की आवश्यकता है।
मैं नहीं जानता कि कौन से हावरिन पैकेज इस सुरक्षा को शामिल करते हैं या नहीं करते हैं, लेकिन अगर आप इस सब के लिए नए हैं, और आप लोकप्रिय प्रकाशित 'स्निपेट' संस्करण का उपयोग करने जा रहे हैं, तो अब आपको पता है कि इसे सुरक्षा की आवश्यकता है, और यह सुरक्षा लागू करने के लिए बहुत सरल है, अर्थात, यदि आप विन्सेन्ट का उपयोग नहीं कर रहे हैं, और पैकेज के कोड को संशोधित करने के लिए आसान पहुँच के बिना एक पैक हावरिन का उपयोग नहीं कर रहे हैं।
IOW, चाहे विन्सेंटी या हैवरसाइन या स्लोक का उपयोग कर रहा हो, किसी को कोड के साथ किसी भी मुद्दे के बारे में पता होना चाहिए, चीजों को देखने और कम करने के लिए, और विन्सेंटी बनाम हैवरसिन बनाम धीमे मुद्दों के साथ कैसे अलग होगा, यह एक-एक के बारे में पता चलेगा। गुप्त मुद्दों / edgecases, जो लोकप्रिय रूप से ज्ञात हो भी सकता है और नहीं भी।