2011-10-28 10 views
7

मैं doubles के रूप में कई अक्षांश और अक्षांश संग्रहित कर रहा हूं, मुझे आश्चर्य है कि क्या मैं उन्हें floats के रूप में संग्रहीत करने से दूर हो सकता हूं।एक सटीक रिज़ॉल्यूशन फ्लोटिंग पॉइंट नंबर का अनुमानित रिज़ॉल्यूशन क्या है जब इसके आसपास शून्य

इस प्रश्न का उत्तर देने के लिए, मुझे single precision floating point number के अनुमानित संकल्प को जानने की आवश्यकता है जब संग्रहित मान लंबे समय/अक्षांश (-180 से +180) होते हैं।

+2

लंबे समय तक -180 से 180 तक और अक्षांश -90 से 9 0 तक अक्षांश होते हैं। – caf

+0

अच्छा बिंदु, बीमार इसे सही करें। – Robert

उत्तर

12

आपके प्रश्न में कई व्याख्याएं हो सकती हैं।

यदि यह केवल कोणों के लिए है और डिस्क या डिवाइस पर भंडारण के लिए है, तो मैं आपको एक पूरी तरह से अलग तकनीक का उपयोग करके अपने मूल्यों को स्टोर करने का सुझाव दूंगा: 32 बिट पूर्णांक के रूप में स्टोर करें।

int encodedAngle = (int)(value * (0x7FFFFFFF/180.0)); 

इसे पुनर्प्राप्त करने के लिए, इसके विपरीत करें।

double angle = (encodedAngle/(0x7FFFFFFF/180.0)); 

इस तरह आपके पास साइन के लिए 180 डिग्री और 1 बिट के लिए पूर्ण 31 बिट रिज़ॉल्यूशन है।

आप अपने मूल्यों को रैम में रखने के लिए भी इस तरह उपयोग कर सकते हैं, इस कवरेज की लागत सीधे युगल के साथ काम की तुलना में अधिक है, लेकिन यदि आप अपनी याददाश्त कम रखना चाहते हैं लेकिन उच्च रिज़ॉल्यूशन उच्च है तो यह काफी अच्छा काम कर सकता है। लागत इतनी अधिक नहीं है, केवल/से पूर्णांक/से गुणा करने के लिए एक रूपांतरण और एक गुणा, आधुनिक प्रोसेसर इसे बहुत ही कम समय में करेंगे, और चूंकि एक्सेस मेमोरी कम है, अगर सूची में बहुत कुछ है मूल्यों का, आपका कोड प्रोसेसर कैश के साथ अधिक अनुकूल होगा।

आपका संकल्प 180/((2^31) - 1) = 8.38190318 × 10^-8 डिग्री, बुरा नहीं :)

+0

वह हस्ताक्षरित पूर्णांक का उपयोग नहीं कर सकता क्योंकि उसे -360 से 360 के मानों का प्रतिनिधित्व करना है। अच्छा जवाब। –

+2

लेट/लम्बाई के लिए, + -360 निश्चित रूप से एक फर्जी आवश्यकता है ... वैसे भी यह जवाब सही है, और फ्लोटिंग पॉइंट का उपयोग करना निश्चित रूप से गलत है, जब तक कि आप लंदन के पास बहुत अच्छी परिशुद्धता और प्रशांत क्षेत्र में भयानक मात्रा नहीं चाहते ... –

+0

-180 .. + 180 –

5

एकल-परिशुद्धता फ्लोट के साथ आप जिस संकल्प पर भरोसा कर सकते हैं वह लगभग 360/(2^23) या 4 * 10^-5 है।

अधिक सटीक, सबसे बड़ी एकल-परिशुद्धता फ्लोट 360. (जो वास्तव में प्रतिनिधित्व योग्य है) से कड़ाई से कम है 359.999969 है। पूरी श्रृंखला -360. .. 360 के लिए, आप इन दो संख्याओं के बीच अंतर के रूप में कम से कम अंतर का प्रतिनिधित्व करने में सक्षम होंगे।

+0

शानदार, मेरे गणनाओं से एक लोन/लैट के लिए अधिकतम 5 मीटर की दूरी पर, जो मेरे लिए स्वीकार्य नहीं है। मदद के लिये शुक्रिया! – Robert

+1

@Robert जब आपको एक समान रिज़ॉल्यूशन की आवश्यकता होती है, तो फ़्लोटिंग-पॉइंट प्रारूप थोड़ा अपर्याप्त होते हैं (हालांकि मैं स्वीकार करता हूं कि वे बहुत सुविधाजनक हैं)। सिंगल-प्रेसिजन फ्लोट के साथ, संकल्प 23-बिट मंटिसा द्वारा सीमित होता है जब आपके पास 2^32 समान दूरी वाले मूल्य हो सकते हैं।डबल-परिशुद्धता के लिए, संकल्प 52-बिट मंटिसा द्वारा सीमित है जहां आप समान रूप से दूरी वाले मानों का प्रतिनिधित्व करने के लिए सभी 64 बिट्स का उपयोग कर सकते हैं। –

1

आमतौर पर फ्लोट 4 बाइट्स (32 बिट्स) होते हैं जबकि युगल डबल होते हैं। हालांकि, यदि आप गणना कर रहे हैं तो सटीक सटीकता कार्यान्वयन (और हार्डवेयर) विशिष्ट है। कुछ प्रणालियों पर सभी फ्लोट्स को भ्रम में जोड़ने के लिए, युगल के रूप में संग्रहीत किया जाएगा।

0

निर्भर करता है, बल्कि नहीं होगा।

32-बिट फ्लोट स्टोर 7 महत्वपूर्ण अंक। यह आमतौर पर देशांतर/अक्षांश के उचित संकल्प को संग्रहीत करने के लिए बहुत कम है। उदाहरण के लिए, openstreetmap.org अल्पविराम के बाद छह अंकों का उपयोग करता है, इसलिए न्यूनतम आठ, अधिकतम दस अंक।

संक्षेप में, float64 का उपयोग करें।

संबंधित मुद्दे