आप फ्लोट का उपयोग कब करते हैं और कब डबल का उपयोग करते हैं


194

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

आप फ्लोट का उपयोग कब करते हैं और कब डबल का उपयोग करते हैं? क्या आप हमेशा डबल का उपयोग करते हैं, केवल जब मेमोरी बाधाएं मौजूद होती हैं तो आप फ्लोट के लिए जाते हैं? या आप हमेशा फ्लोट का उपयोग करते हैं जब तक कि सटीक आवश्यकता के लिए आपको डबल का उपयोग करने की आवश्यकता न हो? क्या फ्लोट और डबल के बीच बुनियादी गणितज्ञों की कम्प्यूटेशनल जटिलता के बारे में कुछ महत्वपूर्ण अंतर हैं? फ्लोट या डबल का उपयोग करने के पेशेवरों और विपक्ष क्या हैं? और क्या आपने भी लंबे डबल का उपयोग किया है?


28
कई मामलों में आप न तो उपयोग करना चाहते हैं, बल्कि एक फ़्लोटिंग फ़्लोटिंग या फ़िक्सपॉइंट प्रकार। बाइनरी फ्लोटिंग पॉइंट प्रकार वास्तव में अधिकांश दशमलव का प्रतिनिधित्व नहीं कर सकते हैं।
कोडइन्चोज

3
संबंधित क्या फ़्लोटिंग पॉइंट राउंडिंग त्रुटियों का कारण बनता है? । @CodesInChaos मेरा जवाब है कि आपको उस निर्धारण को बनाने में मदद करने के लिए संसाधनों का सुझाव है, कोई एक आकार-फिट-सभी समाधान नहीं है।
मार्क बूथ

बहुत अच्छा जवाब मिला: स्टैक ओवरफ्लो
हारिस

5
"दशमलव" से आपका वास्तव में क्या तात्पर्य है। यदि आपको 0.01 बिल्कुल (जैसे, पैसे के लिए) मानों का प्रतिनिधित्व करने की आवश्यकता है, तो (बाइनरी) फ्लोटिंग-पॉइंट का जवाब नहीं है। यदि आप केवल गैर-पूर्णांक संख्याओं का अर्थ करते हैं, तो फ़्लोटिंग-पॉइंट की संभावना ठीक है - लेकिन फिर "दशमलव" आपको वर्णन करने के लिए सबसे अच्छा शब्द नहीं है कि आपको क्या चाहिए।
कीथ थॉम्पसन

1
आपके पास हमेशा कोई विकल्प नहीं होता है। उदाहरण के लिए, Arduino प्लेटफ़ॉर्म पर, डबल और फ्लोट दोनों फ्लोट के बराबर हैं। असली डबल्स को संभालने के लिए आपको एक ऐड-इन लाइब्रेरी ढूंढनी होगी।
कीवरोन

जवाबों:


187

फ़्लोटिंग-पॉइंट प्रकार के लिए डिफ़ॉल्ट विकल्प होना चाहिए double। यह भी प्रकार है कि आप एक प्रत्यय के बिना या (सी में) मानक कार्यों कि चल बिन्दु संख्या (जैसे पर काम फ्लोटिंग प्वाइंट शाब्दिक साथ मिलता है exp, sin, आदि)।

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

long doubleयदि आपको अधिक रेंज या सटीकता की आवश्यकता है double, तो इसका उपयोग किया जा सकता है और यदि यह आपके लक्ष्य प्लेटफ़ॉर्म पर प्रदान करता है।

सारांश में, floatऔर "हर दिन" उपयोग के लिए long double, विशेषज्ञों द्वारा उपयोग के लिए आरक्षित होना चाहिए double


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

4
एक परिशिष्ट के रूप में, यदि आपको अन्य प्रणालियों के साथ संगतता की आवश्यकता है, तो समान डेटा प्रकारों का उपयोग करना लाभप्रद हो सकता है।
zzzzBov

15
मैं लाखों की संख्या के लिए फ़्लोट्स का उपयोग करूंगा, न कि अधिक संख्या में। इसके अलावा, कुछ GPU फ़्लोट्स के साथ बेहतर करते हैं, उस विशेष मामले में फ़्लोट्स का उपयोग करते हैं। और, जैसा कि आप कहते हैं, डबल्स का उपयोग करें।
user949300

4
@PatriciaShanahan - 'प्रदर्शन से संबंधित समस्या ..' एक अच्छा उदाहरण है यदि आप SSE2 या इसी तरह के वेक्टर निर्देशों का उपयोग करने की योजना बना रहे हैं, तो आप फ्लोट में 4 ऑप्स / वेक्टर कर सकते हैं (बनाम 2 प्रति डबल) जो एक महत्वपूर्ण सुधार कर सकता है। आधे से अधिक op और आधे से अधिक डेटा पढ़ने और लिखने के लिए)। यह थ्रेशोल्ड को काफी कम कर सकता है जहां फ़्लोट्स का उपयोग आकर्षक हो जाता है, और संख्यात्मक मुद्दों को हल करने के लिए परेशानी के लायक है।
19

12
मैं एक अतिरिक्त सलाह के साथ इस उत्तर का समर्थन करता हूं: जब कोई प्रदर्शन के लिए RGB मानों के साथ काम कर रहा होता है, तो यह उपयोग करने के लिए स्वीकार्य होता है float(और कभी-कभी आधा-सटीक) क्योंकि न तो मानव आंख, प्रदर्शन, या रंग प्रणाली में सटीकता के कई बिट्स होते हैं । यह सलाह ओपनगेल आदि के लिए लागू है। यह अतिरिक्त सलाह चिकित्सा छवियों पर लागू नहीं होती है, जिनकी अधिक सख्त सटीक आवश्यकताएं हैं।
22

42

आधुनिक कंप्यूटरों को लक्षित करने वाले कोड में डबल के बजाय फ्लोट का उपयोग करने का शायद ही कभी कारण है। अतिरिक्त परिशुद्धता कम कर देता है (लेकिन समाप्त नहीं करता है) गोलाई त्रुटियों या अन्य गड़बड़ी की समस्याओं का कारण बनता है।

मैं फ्लोट का उपयोग करने के बारे में सोच सकता हूं:

  1. आप संख्याओं के बड़े सरणियों को संग्रहीत कर रहे हैं और अपने कार्यक्रम की मेमोरी खपत को कम करने की आवश्यकता है।
  2. आप एक ऐसी प्रणाली को लक्षित कर रहे हैं जो मूल रूप से दोहरे-सटीक फ़्लोटिंग पॉइंट का समर्थन नहीं करती है। कुछ समय पहले तक, कई ग्राफिक्स कार्ड केवल एकल परिशुद्धता फ़्लोटिंग पॉइंट का समर्थन करते थे। मुझे यकीन है कि बहुत कम बिजली और एम्बेडेड प्रोसेसर हैं जो सीमित फ्लोटिंग पॉइंट समर्थन भी हैं।
  3. आप ऐसे हार्डवेयर को लक्षित कर रहे हैं, जहाँ एकल-परिशुद्धता डबल-परिशुद्धता की तुलना में तेज़ है, और आपका एप्लिकेशन फ्लोटिंग पॉइंट अंकगणित का भारी उपयोग करता है। आधुनिक इंटेल सीपीयू पर मेरा मानना ​​है कि सभी फ्लोटिंग पॉइंट कैलकुलेशन डबल परिशुद्धता में किए जाते हैं, इसलिए आप यहां कुछ भी हासिल नहीं करते हैं।
  4. आप निम्न-स्तरीय अनुकूलन कर रहे हैं, उदाहरण के लिए विशेष CPU निर्देशों का उपयोग करना जो एक समय में कई नंबरों पर काम करते हैं।

इसलिए, मूल रूप से, डबल तब तक जाने का तरीका है जब तक कि आपके पास हार्डवेयर सीमाएं न हों या जब तक कि विश्लेषण ने यह नहीं दिखाया हो कि डबल सटीक संख्याओं को संग्रहीत करना मेमोरी के उपयोग में महत्वपूर्ण योगदान दे रहा है।


2
"आधुनिक कंप्यूटर" अर्थ इंटेल x86 प्रोसेसर। कुछ मशीनों का उपयोग किया गया एंसिएंट मूल फ्लोट प्रकार के साथ पूरी तरह से पर्याप्त परिशुद्धता प्रदान करता है। (सीडीसी 6600 में एक 60-बिट शब्द, 48 बिट्स का सामान्यीकृत फ्लोटिंग-पॉइंट मंटिसा, 12 बिट्स ऑफ एक्सपोनेंट का उपयोग किया गया था। यह
ALMOST है

@ John.R.Strohm: सहमत हुए, लेकिन C संकलनकर्ता CDC6600 पर मौजूद नहीं थे। यह फोरट्रान IV था ...
बेसिल स्टारीनेवविच

"आधुनिक कंप्यूटर" से मेरा मतलब है कि पिछले एक या दो दशक में निर्मित कोई भी प्रोसेसर, या वास्तव में, क्योंकि IEEE फ़्लोटिंग पॉइंट मानक व्यापक रूप से लागू किया गया था। मैं पूरी तरह से जानता हूं कि गैर-x86 आर्किटेक्चर मौजूद हैं और मेरे जवाब के साथ दिमाग में था - मैंने GPU और एम्बेडेड प्रोसेसर का उल्लेख किया है, जो आमतौर पर x86 नहीं हैं।
user611910

हालांकि यह सच नहीं है। SSE2 एक ऑपरेशन में 4 फ्लोट्स या 2 डबल्स में हेरफेर कर सकता है, AVX 8 फ्लोट्स या 4 डबल्स में हेरफेर कर सकता है, AVX-512 16 फ्लोट्स या 8 डबल्स में हेरफेर कर सकता है। किसी भी तरह के उच्च प्रदर्शन कंप्यूटिंग के लिए, फ्लोट्स पर गणित को x86 पर डबल्स पर समान संचालन की गति से दोगुना माना जाना चाहिए।
लैरी ग्रिट्ज़

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

10

doubleअपने सभी गणना और अस्थायी चर के लिए उपयोग करें । उपयोग करें floatजब आपको संख्याओं की एक सरणी बनाए रखने की आवश्यकता होती है - float[](यदि परिशुद्धता पर्याप्त है), और आप हजारों से अधिक floatसंख्याओं के साथ काम कर रहे हैं ।

कई / अधिकांश गणित फ़ंक्शन या ऑपरेटर कनवर्ट / रिटर्न करते हैं double, और आप floatकिसी भी मध्यवर्ती चरणों के लिए संख्या वापस नहीं डालना चाहते हैं ।

उदा। यदि आपके पास फ़ाइल या स्ट्रीम से 100,000 संख्याओं का इनपुट है और उन्हें क्रमबद्ध करने की आवश्यकता है, तो संख्याओं को एक में डालें float[]


5

कुछ प्लेटफ़ॉर्म (ARM Cortex-M2, Cortex-M4 etc) दोहरे का समर्थन नहीं करते हैं (यह हमेशा आपके प्रोसेसर के संदर्भ में जांचा जा सकता है। यदि कोई संकलन चेतावनी या त्रुटियां नहीं हैं, तो इसका मतलब यह नहीं है कि कोड इष्टतम है। डबल का अनुकरण किया जा सकता है।) यही कारण है कि आपको इंट या फ्लोट से चिपके रहने की आवश्यकता हो सकती है ।

अगर ऐसा नहीं है, तो मैं दोगुना उपयोग करूंगा ।

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

http://perso.ens-lyon.fr/jean-michel.muller/goldberg.pdf


3
यह प्रश्न पहले से ही एक साल पहले बहुत अच्छी तरह से उत्तर दिया गया था ... लेकिन किसी भी मामले में, मैं कहूंगा कि आप किसी भी समय डबल परिशुद्धता एफपीयू त्वरण के साथ प्लेटफार्मों पर डबल का उपयोग कर रहे हैं, आपको इसका उपयोग किसी अन्य पर भी करना चाहिए, भले ही इसका मतलब हो संकलक को फ्लोटिंग-पॉइंट के साथ एफपीयू का लाभ लेने के बजाय इसका अनुकरण करने दें (ध्यान दें कि एफपीयू सभी प्लेटफार्मों पर आवश्यक नहीं है, वास्तव में एक कॉर्टेक्स-एम 4 आर्किटेक्चर उन्हें एक वैकल्पिक सुविधा के रूप में परिभाषित करता है [एम 2 एक टाइपो था?) )।
सेलाली अडोबोर

उस तर्क की कुंजी है, जबकि यह सच है कि फ्लोटिंग पॉइंट अंकगणित का थके हुए होना चाहिए, और यह कई "quirks" है, निश्चित रूप से डबल्स के लिए FPU समर्थन की उपस्थिति का मतलब नहीं है कि बस फ्लोट के बजाय डबल्स का उपयोग करें। फ़्लोट्स आमतौर पर डबल्स की तुलना में बहुत तेज़ होते हैं और कम मेमोरी लेते हैं (FPU फीचर्स बदलती हैं)। उपयोग की मात्रा इस बिंदु को समय से पहले अनुकूलन पर होने से रोकती है। जैसा कि तथ्य यह है कि डबल्स स्पष्ट रूप से बहुत सारे (शायद सबसे अधिक) अनुप्रयोगों के लिए ओवरकिल हैं। क्या इस पृष्ठ पर मौजूद तत्वों को वास्तव में १३ दशमलव स्थानों की गणना के लिए अपने सापेक्ष स्थान और आकार की आवश्यकता है ?
सेलाली अडोबोर

2
जब एक ऑफ साइट पेज या डॉक्यूमेंट का लिंक शामिल हो, तो कृपया अपने उत्तर में संबंधित जानकारी, या सारांश को डॉक्यूमेंट से कॉपी करें। ऑफ साइट लिंक में समय के साथ गायब होने की प्रवृत्ति होती है।
एडम ज़करमैन

3

वास्तविक दुनिया की समस्याओं के लिए इस प्रश्न का उत्तर देते समय आपके डेटा का नमूना सीमा महत्वपूर्ण है। इसी तरह, शोर मंजिल भी महत्वपूर्ण है। यदि या तो आपके डेटा प्रकार के चयन से अधिक है, तो सटीक वृद्धि से कोई लाभ नहीं होगा।

अधिकांश वास्तविक दुनिया के नमूने 24 बिट डीएसी एस तक सीमित हैं। यह सुझाव देते हुए कि वास्तविक विश्व गणना पर सटीकता के 32 बिट्स पर्याप्त होने चाहिए जहां महत्व 24 बिट्स सटीक है।

डबल परिशुद्धता 2x मेमोरी की लागत पर आती है। इसलिए फ्लोट्स पर डबल्स के उपयोग को सीमित करने से रनिंग एप्लिकेशन की मेमोरी फुटप्रिंट / बैंडविड्थ में भारी कटौती हो सकती है।


-3

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


3
यह उत्तर प्रश्न में कुछ भी नया नहीं जोड़ता है, और वास्तविक उपयोग के बारे में कुछ भी कहने में विफल रहता है।
Martijn Pieters

-5

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

दूसरी ओर, मैं उपयोग करता हूं doubleजब मुझे अधिक सटीकता की आवश्यकता होती है, उदाहरण के लिए जटिल गणितीय एल्गोरिदम।

C99 मानक यह कहता है:

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

मैंने वास्तव में कभी उपयोग नहीं किया long double, लेकिन मैं C / C ++ का इतना उपयोग नहीं करता। आमतौर पर मैं पायथन जैसी गतिशील रूप से टाइप की जाने वाली भाषाओं का उपयोग करता हूं, जहां आपको प्रकारों की परवाह नहीं है।

डबल बनाम फ्लोट के बारे में अधिक जानकारी के लिए, एसओ पर यह प्रश्न देखें ।


25
गंभीर धन गणना के लिए फ्लोटिंग पॉइंट का उपयोग करना शायद एक गलती है।
बार्ट वैन इनगेन शेनॉ

17
फ्लोट पैसे के लिए बिल्कुल गलत प्रकार है। आपको उच्चतम परिशुद्धता का उपयोग करने की आवश्यकता है।
ChrisF

8
पैसे के लिए @BartvanIngenSchenau फ़्लोटिंग पॉइंट आमतौर पर ठीक है, बाइनरी फ़्लोटिंग पॉइंट नहीं है। उदाहरण के लिए .net का Decimalफ्लोटिंग पॉइंट टाइप है और यह आम तौर पर पैसे की गणना के लिए एक अच्छा विकल्प है।
कोडइन्चोस

13
@ क्रिस आपको पैसे के लिए "उच्च परिशुद्धता" की आवश्यकता नहीं है, आपको सटीक मूल्यों की आवश्यकता है।
शॉन मैकसमर्थी

2
@SMMcSomething - उचित बिंदु। हालाँकि, फ़्लोट्स अभी भी गलत प्रकार के हैं और फ़्लोटिंग पॉइंट प्रकार दिए गए हैं जो कि अधिकांश भाषाओं में उपलब्ध हैं जिन्हें आपको "सटीक मान" प्राप्त करने के लिए "उच्च परिशुद्धता" की आवश्यकता होती है।
ChrisF
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.