2009-07-02 30 views

उत्तर

88

आप सही जवाब जानना चाहते हैं, तो आप What Every Computer Scientist Should Know About Floating-Point Arithmetic पढ़ना चाहिए।

संक्षेप में, हालांकि double अपने प्रतिनिधित्व में उच्च परिशुद्धता के लिए अनुमति देता है, कुछ की गणना के लिए यह बड़ा त्रुटियों उत्पादन होगा। "सही" विकल्प है: के रूप में ज्यादा उपयोग आप की जरूरत के रूप में सटीक नहीं बल्कि अधिक और सही एल्गोरिथ्म चुनें।

कई compilers "गैर सख्त" मोड में चल विस्तारित करते बिंदु गणित वैसे भी (यानी एक व्यापक फ्लोटिंग बिंदु हार्डवेयर में उपलब्ध प्रकार, जैसे 80-बिट और 128 बिट तक चल उपयोग करें), इस खाते में रूप में अच्छी तरह से लिया जाना चाहिए । अभ्यास में, आप गति में शायद ही कोई अंतर देख सकते हैं - वे वैसे भी हार्डवेयर के मूल निवासी हैं।

+8

हां। आधुनिक CPUs स्मृति, समानांतर संख्यात्मक प्रसंस्करण इकाइयों और pipelined आर्किटेक्चर के अधिकाधिक मात्रा प्रीफ़ेचिंग के साथ, क्या गति की समस्या वास्तव में कोई मुद्दा नहीं है। यदि आप 4-बाइट फ्लोट के बीच * आकार * अंतर और 8-बाइट डबल * मेमोरी पदचिह्न में अंतर डाल सकते हैं, तो आप बड़ी संख्या में संख्याओं से निपट रहे हैं। – lavinio

+5

खैर SSE (या किसी भी vertor चल बिन्दु इकाई) डबल परिशुद्धता की तुलना में एक परिशुद्धता में फ्लॉप फिल्मों की दो बार नंबर प्रोसेस करने में सक्षम हो जाएगा। यदि आप केवल x87 (या किसी भी स्केलर) फ्लोटिंग पॉइंट कर रहे हैं तो शायद इससे कोई फर्क नहीं पड़ता। –

+1

@ ग्रेग रोजर्स: इस समय संकलक स्मार्ट नहीं हैं। जब तक आप कच्चे असेंबली नहीं लिख रहे हैं, तब तक यह अलग नहीं होता है। और हाँ, यह बदल सकता है क्योंकि संकलक विकसित होता है। –

0

डबल में उच्च परिशुद्धता है, जबकि फ्लोट कम स्मृति लेते हैं और तेज़ होते हैं। आम तौर पर आपको फ्लोट का उपयोग तब तक करना चाहिए जब तक आपके पास ऐसा कोई मामला न हो जहां यह पर्याप्त सटीक न हो।

+3

ठेठ आधुनिक कंप्यूटर पर, डबल बस है फ्लोट के रूप में तेजी से। –

6

मैं व्यक्तिगत रूप से कुछ बार बाधाओं को देखता हूं जब तक कि मैं कुछ बाधाओं को नहीं देखता। तब मैं फ्लोट करने के लिए या ले जाने पर विचार किसी अन्य भाग

0

नाव के बीच मुख्य अंतर के अनुकूलन और डबल परिशुद्धता है। विकिपीडिया में Single precision (फ्लोट) और Double precision के बारे में अधिक जानकारी है।

3

यह इस बात पर निर्भर करता है कि संकलक डबल कैसे लागू करता है। यह एक ही प्रकार के लिए डबल और फ्लोट के लिए कानूनी है (और यह कुछ सिस्टम पर है)।

कहा जा रहा है कि, यदि वे वास्तव में अलग हैं, तो मुख्य मुद्दा सटीक है। आकार में अंतर के कारण एक डबल में बहुत अधिक सटीकता होती है। यदि आप जिन नंबरों का उपयोग कर रहे हैं वे आमतौर पर एक फ्लोट के मूल्य से अधिक हो जाएंगे, फिर एक डबल का उपयोग करें।

कई अन्य लोगों ने प्रदर्शन जारी करने का उल्लेख किया है। विचारों की मेरी सूची पर यह बिल्कुल सही होगा। सुधार आपके # 1 विचार होना चाहिए।

1

मैं मतभेद (जो के रूप हर किसी को बताते हैं, तैरता कम जगह लेने के लिए और तेजी से सामान्य रूप में कर रहे हैं) की परवाह किए बिना लगता है ... क्या कभी किसी ने डबल का उपयोग कर प्रदर्शन के मुद्दों भुगतना पड़ता है? मैं कहता हूं कि डबल का उपयोग करें ... और यदि बाद में आप "वाह, यह वास्तव में धीमा है" का निर्णय लेते हैं ... ... अपनी प्रदर्शन बाधा पाएं (जो संभवतया आपने डबल का उपयोग नहीं किया है)। फिर, यदि यह अभी भी आपके लिए बहुत धीमा है, तो देखें कि आप कुछ परिशुद्धता बलिदान कर सकते हैं और फ्लोट का उपयोग कर सकते हैं।

3

Use whichever precision is required to achieve the appropriate results। आप तो पाते हैं कि आपके कोड के रूप में अच्छा प्रदर्शन नहीं कर के रूप में आप चाहते हैं, तो (आप सही रूपरेखा का इस्तेमाल किया?) पर एक नज़र डालें:

0

यह अत्यधिक निर्भर करता है सीपीयू पर सबसे स्पष्ट व्यापार-बंद सटीकता और स्मृति के बीच होते हैं। जीबी रैम के साथ, स्मृति एक मुद्दा नहीं है, इसलिए आमतौर पर double एस का उपयोग करना बेहतर होता है।

प्रदर्शन के लिए, यह सीपीयू पर अत्यधिक निर्भर करता है।float एस आमतौर पर 32 बिट मशीन पर double एस से बेहतर प्रदर्शन प्राप्त करेगा। 64 बिट पर, double एस कभी-कभी तेज़ होते हैं, क्योंकि यह आमतौर पर मूल आकार होता है। फिर भी, डेटा प्रकारों की आपकी पसंद से कहीं अधिक महत्वपूर्ण बात यह है कि आप अपने प्रोसेसर पर सिम निर्देशों का लाभ उठा सकते हैं या नहीं।

11

डबल अधिक सटीक है लेकिन 8 बाइट्स पर कोडित है। फ्लोट केवल 4 बाइट्स है, इसलिए कम कमरा और कम परिशुद्धता।

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

मुझे लगता है कि यह इस तरह की बग के कारण है कि एरियन 6 रॉकेट कुछ साल पहले विस्फोट कर चुका है !! !

प्रकार एक चर

+7

+1 मिश्रण के लिए कारण हो सकता है समस्या –

+3

ध्यान दें कि नाव के लिए 4/8 byts/डबल भी इसकी गारंटी नहीं है, यह मंच पर निर्भर करेगा। यह भी वही प्रकार हो सकता है ... – sleske

26

इस सवाल का जवाब देना असंभव है के लिए प्रयोग की जाने वाली के बारे में ध्यान से लगता है कि के बाद से वहाँ प्रश्न का कोई संदर्भ है। यहाँ कुछ चीजें हैं जो चुनाव को प्रभावित कर सकते हैं: तैरता है, डबल्स और लंबे समय युगल के

  1. संकलक कार्यान्वयन। सी ++ मानक राज्य:

    तीन फ़्लोटिंग पॉइंट प्रकार हैं: फ्लोट, डबल और लम्बा डबल। प्रकार डबल कम से कम उतना सटीक प्रदान करता है जितना कि फ्लोट के रूप में, और लंबे समय तक डबल डबल के रूप में कम से कम सटीकता प्रदान करता है।

    तो, सभी तीन स्मृति में एक ही आकार के हो सकते हैं।

  2. एक एफपीयू की उपस्थिति। सभी सीपीयू में एफपीयू नहीं होते हैं और कभी-कभी फ़्लोटिंग पॉइंट प्रकार नकल होते हैं और कभी-कभी फ़्लोटिंग पॉइंट प्रकार समर्थित नहीं होते हैं।

  3. एफपीयू आर्किटेक्चर। आईए 32 का एफपीयू 80 बिट आंतरिक रूप से है - 32 बिट और 64 बिट फ्लोट लोड पर 80 बिट तक बढ़ाए जाते हैं और स्टोर पर कम हो जाते हैं। सिमड भी है जो समानांतर में चार 32 बिट फ्लोट या दो 64 बिट फ्लोट कर सकता है। सिमड का उपयोग मानक में परिभाषित नहीं किया गया है, इसलिए इसे एक कंपाइलर की आवश्यकता होगी जो यह निर्धारित करने के लिए अधिक जटिल विश्लेषण करता है कि सिमड का उपयोग किया जा सकता है या विशेष कार्यों (पुस्तकालयों या इंट्रिनिक्स) के उपयोग की आवश्यकता है। 80 बिट आंतरिक प्रारूप का ऊपरी भाग यह है कि आप RAM पर डेटा कितनी बार सहेजे जाते हैं (इस प्रकार, सटीकता खोने) के आधार पर आप थोड़ा अलग परिणाम प्राप्त कर सकते हैं। इस कारण से, कंपाइलर्स विशेष रूप से फ़्लोटिंग पॉइंट कोड को अनुकूलित नहीं करते हैं।

  4. मेमोरी बैंडविड्थ। यदि एक डबल को फ्लोट की तुलना में अधिक संग्रहण की आवश्यकता होती है, तो डेटा को पढ़ने में अधिक समय लगेगा। यह मूर्ख जवाब है। एक आधुनिक आईए 32 पर, यह सब इस बात पर निर्भर करता है कि डेटा कहां से आ रहा है। यदि यह एल 1 कैश में है, तो लोड नगण्य है, बशर्ते डेटा एक कैश लाइन से आता है। यदि यह एक से अधिक कैश लाइन फैलाता है तो वहां एक छोटा ओवरहेड होता है। यदि यह एल 2 से है, तो इसमें थोड़ी देर लगती है, अगर यह रैम में है तो यह अभी भी लंबा है और आखिरकार, यदि डिस्क पर है तो यह एक बड़ा समय है। इसलिए डेटा का उपयोग करने के तरीके की तुलना में फ्लोट या डबल की पसंद कम महत्वपूर्ण है। यदि आप अनुक्रमिक डेटा पर बहुत छोटी गणना करना चाहते हैं, तो एक छोटा डेटा प्रकार बेहतर है। एक छोटे डेटा सेट पर बहुत अधिक गणना करने से आप किसी भी महत्वपूर्ण प्रभाव के साथ बड़े डेटा प्रकारों का उपयोग करने की अनुमति देंगे। यदि आप डेटा को बहुत यादृच्छिक रूप से एक्सेस कर रहे हैं, तो डेटा आकार की पसंद महत्वहीन है - डेटा पृष्ठों/कैश लाइनों में लोड किया जाता है। तो अगर आप केवल रैम से बाइट चाहते हैं, तो आप 32 बाइट स्थानांतरित कर सकते हैं (यह सिस्टम के आर्किटेक्चर पर बहुत निर्भर है)।इन सब के शीर्ष पर, सीपीयू/एफपीयू सुपर-स्केलर (उर्फ पाइपलाइन) हो सकता है। तो, भले ही एक लोड कई चक्र समय लग सकता है, सीपीयू/एफपीयू कुछ और (उदाहरण के लिए एक गुणा) है कि एक हद तक लोड समय छुपाता करने में व्यस्त हो सकता है।

  5. मानक फ़्लोटिंग पॉइंट मानों के लिए किसी विशेष प्रारूप को लागू नहीं करता है।

आप एक विनिर्देश है, तो यह है कि आप इष्टतम चुनाव के लिए मार्गदर्शन करेंगे। अन्यथा, यह अनुभव करने के लिए नीचे है कि क्या उपयोग करना है।

26

जब तक आपके पास अन्यथा करने का कोई विशिष्ट कारण न हो, तो डबल का उपयोग करें।

शायद आश्चर्य की बात है, यह डबल है और फ्लोट नहीं है जो सी (और सी ++) में "सामान्य" फ़्लोटिंग-पॉइंट प्रकार है। मानक गणित कार्य जैसे पाप और लॉग तर्क के रूप में युगल लेते हैं, और युगल लौटते हैं। एक सामान्य फ्लोटिंग प्वाइंट शाब्दिक, जब आप अपने प्रोग्राम में लिखने 3.14 के रूप में, प्रकार डबल है। तैरना नहीं

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

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