आपको फ्लोट / डबल की आवश्यकता क्यों है?


29

मैं http://www.joelonsoftware.com/items/2011/06/27.html देख रहा था और जॉन स्कीट मजाक में हंसते हुए लगभग 0.3 नहीं 0.3 हो रहा था। मुझे व्यक्तिगत रूप से कभी भी फ़्लोट्स / डेसीमल / डबल्स की समस्या नहीं थी, लेकिन फिर मुझे याद है कि मैंने 6502 बहुत जल्दी सीख लिए थे और मुझे अपने अधिकांश कार्यक्रमों में फ़्लोट की आवश्यकता नहीं थी। केवल एक बार मैंने इसका उपयोग ग्राफिक्स और गणित के लिए किया था जहां गलत संख्याएं ठीक थीं और आउटपुट स्क्रीन के लिए था और संग्रहीत नहीं किया जाना था (एक डीबी, फ़ाइल में) या उस पर निर्भर।

मेरा सवाल यह है कि आप कहाँ थे जहाँ आप आमतौर पर फ्लोट्स / डेसीमल / डबल का उपयोग करते हैं? इसलिए मैं इन गोचरों के लिए देखना चाहता हूं। पैसे के साथ, मैं सेंट द्वारा लॉन्ग और स्टोर वैल्यू का उपयोग करता हूं, एक गेम में किसी ऑब्जेक्ट की गति के लिए मैं इनट्स और डिवाइड (या बिटशिफ्ट) को जोड़ता हूं, यह जानने के लिए कि मुझे पिक्सेल को स्थानांतरित करने की आवश्यकता है या नहीं। (मैंने 6502 दिनों में ऑब्जेक्ट को स्थानांतरित किया, हमारे पास कोई विभाजन नहीं था और न ही तैरता था, लेकिन इसमें बदलाव नहीं हुआ था)।

इसलिए मैं ज्यादातर उत्सुक था।


10
क्योंकि यह बहुत मायने रखता है कि मेरे बंधक पर जो ब्याज मैं चुकाता हूं वह 12.6 है और डस्ट बन जाता है 13 बस cos 13 एक ऐसा ही अच्छा दौर है।
चानी

1
"मैंने 6502 बहुत जल्दी सीख लिए और मुझे अपने अधिकांश कार्यक्रमों में कभी भी तैरने की आवश्यकता नहीं पड़ी ... एक वस्तु की गति के लिए मैं एक इन्ट्स जोड़ता हूँ और एक पिक्सेल को स्थानांतरित करने या न करने के लिए मान को विभाजित करता हूँ।" आधुनिक अभ्यास में इन कार्यों को पूरा करने के लिए ये बहुत ही असामान्य तरीके हैं, सिवाय धन के लंबे सेंट के रूप में प्रतिनिधित्व के।
jprete

अच्छी बात है कि कंप्यूटर मिलिटेंट्स को समझते हैं।
टाइलेरमैक

1
या इसके अलावा, हम दशमलव का उपयोग क्यों करते हैं जब हम भिन्न का उपयोग कर सकते हैं?
टाइलेरमैक

6
@Scrooge - विडंबना यह है कि आप फ्लोट में 0.6 का प्रतिनिधित्व नहीं कर सकते हैं।
मार्टिन बेकेट

जवाबों:


28

क्योंकि वे, अधिकांश उद्देश्यों के लिए, पूर्णांकों की तुलना में अधिक सटीक हैं।

अब वो कैसे? "किसी खेल में किसी वस्तु की गति के लिए ..." ऐसे मामले के लिए यह एक अच्छा उदाहरण है। कहें कि आपको कुछ बहुत तेज़ वस्तुओं की आवश्यकता है, जैसे कि गोलियां। पूर्णांक गति चर के साथ उनकी गति का वर्णन करने में सक्षम होने के लिए, आपको यह सुनिश्चित करने की आवश्यकता है कि गति पूर्णांक चर की सीमा में है, इसका मतलब है कि आपके पास मनमाने ढंग से ठीक रेखापुंज नहीं हो सकता है।

लेकिन फिर, आप कुछ बहुत धीमी वस्तुओं का भी वर्णन करना चाह सकते हैं, जैसे घड़ी का घंटा हाथ। चूँकि यह बुलेट ऑब्जेक्ट्स की तुलना में परिमाण के 6 क्रमों के बारे में है, पहला ld (10 about) that 20 बिट्स शून्य है, जो short intशुरू से ही प्रकारों को नियंत्रित करता है । ठीक है, आज हम longहर जगह हैं, जो हमें अभी भी आराम से 12 बिट्स के साथ छोड़ते हैं। लेकिन फिर भी, घड़ी की गति केवल चार दशमलव स्थानों तक सटीक होगी। यह बहुत अच्छी घड़ी नहीं है ... लेकिन यह निश्चित रूप से एक खेल के लिए ठीक है। बस, आप रैस्टर को पहले की तुलना में ज्यादा मोटे नहीं बनाना चाहेंगे।

... जो समस्याओं की ओर जाता है अगर किसी दिन आपको एक नई, यहां तक ​​कि तेज प्रकार की वस्तु को पेश करना पसंद करना चाहिए। कोई "हेडरूम" नहीं बचा है।

यदि हम फ्लोट प्रकार चुनते हैं तो क्या होगा? 32 बिट्स के समान आकार, लेकिन अब आपके पास सभी ऑब्जेक्ट्स के लिए सटीक 24 बिट्स की सटीकता है । इसका मतलब है कि घड़ी में साल के लिए सिंक अप-टू-सेकंड रहने के लिए पर्याप्त सटीकता है। गोलियों की कोई उच्च सटीकता नहीं है, लेकिन वे केवल एक सेकंड के अंशों के लिए "जीवित" रहते हैं, इसलिए यदि उनके पास यह पूरी तरह से बेकार होगा। और आप किसी भी तरह की परेशानी में नहीं पड़ते अगर आप बहुत तेज वस्तुओं का वर्णन करना चाहते हैं (प्रकाश की गति क्यों नहीं? कोई समस्या नहीं) या बहुत धीमी गति वाले। आपको निश्चित रूप से एक गेम में ऐसी चीजों की आवश्यकता नहीं होगी, लेकिन आप कभी-कभी भौतिकी सिमुलेशन में करते हैं।

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


इंटेगर पूरी तरह से सही हैं। गलत गणना से अशुद्धि निर्भर है।
fjdumont

15
पूर्णांक पूर्ण रूप से केवल तभी सटीक होते हैं जब आप उनका उपयोग वास्तव में पूर्णांक (only) संख्याओं का प्रतिनिधित्व करने के लिए करते हैं। किसी और चीज का प्रतिनिधित्व करना, वास्तव में, गलत गणना है। ऐसे मामले में, आपके पास दो संभावनाएँ हैं: या तो किसी प्रकार को परिभाषित करें जो पूरी तरह से उन संख्याओं पर निर्भर करता है जिन्हें आप वास्तव में प्रतिनिधित्व करना चाहते हैं। यह संभव है, उदाहरण के लिए गणितज्ञ यह कर सकता है। लेकिन यह बहुत जटिल और समय-महंगा है, और आमतौर पर प्रयास के लायक नहीं है क्योंकि आपको वास्तव में सही परिशुद्धता की आवश्यकता नहीं है। लेकिन आपको अच्छी परिशुद्धता की आवश्यकता होती है , और यही वह जगह है जहाँ फ्लोट आमतौर पर पूर्णांक की तुलना में बेहतर काम करते हैं।
लेफ्टरेंबाउट

53

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


28

आपके यहाँ वास्तव में दो प्रश्न हैं।

वैसे भी किसी को फ्लोटिंग पॉइंट गणित की आवश्यकता क्यों है?

जैसा कि कार्ल बेवफेल्ट बताते हैं, फ्लोटिंग पॉइंट नंबर आपको निरंतर मात्रा में मॉडल देते हैं - और आप उन सभी को जगह पाते हैं - न केवल भौतिक दुनिया में, बल्कि व्यवसाय और वित्त जैसी जगहों पर भी।

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

और, ज़ाहिर है, वहाँ कंप्यूटर ग्राफिक्स है। मैं यूजर इंटरफेस के लिए आई कैंडी विकसित करने पर परामर्श करता हूं, और आजकल फ्लोटिंग पॉइंट, त्रिकोणमिति, कलन और रैखिक बीजगणित की ठोस समझ के बिना ऐसा करने की कोशिश कर रहा हूं, जो एक पॉकेटकीफ़ के साथ बंदूक की लड़ाई को दिखाने जैसा होगा।

किसी को फ्लोट बनाम डबल की आवश्यकता क्यों होगी ?

IEEE 754 मानक अभ्यावेदन के साथ, एक 32-बिट फ्लोट आपको सटीकता के 7 दशमलव अंकों और 10 -38 से 10 38 की सीमा में विस्तारक प्रदान करता है । 64-बिट डबल आपको सटीकता के लगभग 15 दशमलव अंक देता है, और 1030 -307 से 10 307 की सीमा में घातांक होता है ।

ऐसा लग सकता है कि एक नाव के लिए पर्याप्त होगा जो किसी को यथोचित आवश्यकता होगी, लेकिन यह नहीं है। उदाहरण के लिए, कई वास्तविक विश्व मात्राओं को 7 से अधिक दशमलव अंकों में मापा जाता है।

लेकिन अधिक सूक्ष्म रूप से, एक समस्या है जिसे बोलचाल की भाषा में "राउंडऑफ़ त्रुटि" कहा जाता है। बाइनरी फ़्लोटिंग पॉइंट अभ्यावेदन केवल उन मानों के लिए मान्य होते हैं जिनके भिन्नात्मक भागों में एक हर होता है जो कि 2 की शक्ति होती है, जैसे 1/2, 1/4, 3/4, आदि अन्य अंशों का प्रतिनिधित्व करने के लिए, जैसे 1/10, आप "गोल" निकटतम बाइनरी अंश के लिए मूल्य, लेकिन यह थोड़ा गलत है - यह "राउंडऑफ़ त्रुटि" है। फिर जब आप उन गलत नंबरों पर गणित करते हैं, तो परिणामों में गलतियां आपके द्वारा शुरू की गई तुलना में कहीं अधिक खराब हो सकती हैं - कभी-कभी त्रुटि प्रतिशत गुणा, या यहां तक ​​कि तेजी से ढेर।

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

वास्तव में, उनके 15 दशमलव अंकों के साथ 64-बिट युगल कई अनुप्रयोगों के लिए पर्याप्त नहीं हैं। मैं 1985 में 80-बिट फ्लोटिंग पॉइंट नंबरों का उपयोग कर रहा था, और IEEE अब 128-बिट (16-बाइट) फ़्लोटिंग पॉइंट प्रकार को परिभाषित करता है, जिसके लिए मैं उपयोग की कल्पना कर सकता हूं।


2
+1 बॉब खगोल विज्ञान के लिए टेलीस्कोप जैसे उच्च-रिज़ॉल्यूशन नियंत्रण प्रणालियों के साथ मेरा अनुभव है कि 64 बिट्स तब तक अच्छे नहीं होते जब तक आप अपनी शर्तों को नहीं छाँटते। आग नियंत्रण और लंबी दूरी के नेविगेशन के लिए
डिट्टो

20

यह एक सामान्य गलत धारणा है, कि हर जगह आप पैसे का लेन-देन कर रहे हैं, आपको इसे पूर्णांक (सेंट) के रूप में मान देना चाहिए। जबकि ऑन लाइन स्टोर जैसे कुछ सरल मामलों में यह सच है, अगर आपके पास कुछ अधिक उन्नत है तो यह बहुत मदद नहीं करता है।

चलो उदाहरण है: एक डेवलपर प्रति वर्ष $ 100,000 बनाता है। उसका सही महीने का वेतन क्या है? पूर्णांक का उपयोग करने पर आपको $ 8333.33 (33 833333) का परिणाम मिलता है, जो कि 12 से गुणा $ 99,999.96 है। क्या इसे पूर्णांक सहायता के रूप में रखा गया था? नहीं, यह नहीं था।

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

फ्लोट का उपयोग क्यों करें? क्‍योंकि जब आप वर्गाकार मूल, लघुगणक, गैर-पूर्णांक खत्‍म करने वाली शक्तियां आदि जैसे कार्यों का उपयोग कर रहे हैं तो दशमलव का उपयोग करने में मदद नहीं करता है।


1
@ जोब - दशमलव और फ़्लोट बहुत अलग हैं। आप एक दशमलव प्रकार में 0.1 स्टोर कर सकते हैं, लेकिन फ्लोट या डबल में नहीं।
स्कॉट व्हिटलॉक

3
मेरा एक और सवाल था। यदि आपने भुगतान किया $100,000/12और फ्लोट का उपयोग किया। परिणाम $ 100,000 क्यों होगा? फ्लोट (या दशमलव) को हर बार किसी को भुगतान करने के लिए ऊपर या नीचे क्यों नहीं किया जाएगा? मैं चेक लिखने के बारे में बात कर रहा हूं (आप 1/2 या 1/3 प्रतिशत कर सकते हैं) या एक सीधा जमा (मुझे लगता है कि इसकी एक ही सीमा है)

@acid: >>> x = 100000 / 12.0 >>> x * 12 100000.0
vartec

मेरी टिप्पणी को फिर से पढ़ें? मेरा सवाल यह है कि जब मैं हर महीने चेक बनाने के लिए सॉफ्टवेयर का उपयोग करता हूं। चूंकि एक व्यक्ति 1/2 प्रतिशत का भुगतान नहीं कर सकता है, व्यक्ति को एक वर्ष के बाद पूरी राशि कैसे मिलती है?

2
@acid: आप सीधे विभाजन का उपयोग नहीं कर सकते, भले ही आप पूर्णांक, दशमलव का उपयोग करें या फिर फ्लोट के रूप में विभाजित करें। यह संपूर्ण बिंदु है, दशमलव का उपयोग करने से यह उस स्थिति में मदद नहीं करता है।
12

4

आपने जो वर्णन किया है वह उन स्थितियों के लिए पूरी तरह से अच्छा काम है जहां आप सभी इनपुट और आउटपुट को नियंत्रित करते हैं

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

वास्तव में आप इन समस्याओं का सामना करेंगे भले ही आप अपने द्वारा बताई गई ट्रिक्स का उपयोग करें। मूल्य पर 17.5% कर की गणना करते समय आप भिन्नात्मक सेंट प्राप्त करने जा रहे हैं चाहे आप मूल्य को डॉलर या सेंट के रूप में संग्रहीत करते हैं। यदि आप उसे पर्याप्त भुगतान नहीं करते हैं, तो आपको गोलाई सही प्राप्त करनी होगी। सही moneyप्रकारों का उपयोग करना (वे जो भी भाषा आप उपयोग कर रहे हैं) आपको दर्द की दुनिया से बचाएगा।


धन प्रकार क्या है? (भाषा या संदर्भ लिंक) और वह 'सही' प्रकार क्यों है? क्या इसकी वजह ... इसके 128 बिट्स या कुछ और? मेरे अन्य मेरे 'ट्रिक्स' का गलत इस्तेमाल क्यों करेंगे? आपके पास पूरी संख्या प्रतिशत है। यदि आप इसे .175 से गुणा करते हैं, तो आपको एक पूरी संख्या मिलेगी और आप जो चाहें उसके लिए इसका उपयोग कर सकते हैं। आपके उदाहरण के बारे में सोचकर मुझे लगता है कि फ्लोट मेरे मूल्य को पर्याप्त सटीकता के साथ धारण करने में सक्षम होगा, लेकिन मुझे 0.3f == 0.3d के बारे में चिंता करने की आवश्यकता नहीं है। -edit- और +1

1
@ acidzombie24 - मेरा मतलब किसी विशिष्ट प्रकार से नहीं था, लेकिन पैसे के मूल्यों का प्रतिनिधित्व करने के लिए आपकी भाषा किस प्रकार का उपयोग करती है। यदि आपके पास 10 सेंट हैं और 0.175 से गुणा करें, तो आपके पास 1.75 सेंट हैं - आप पूर्णांक अंकगणित के साथ कैसे व्यवहार करते हैं? क्या यह 1 सेंट या 2 सेंट है? इसे गलत तरीके से लें और आपका ग्राहक टैक्स मैन को बहुत पैसा दे सकता है।
ChrisF

आपको .175 (वास्तविक / फ्लोटिंग नंबर) द्वारा 10 (एक पूर्णांक) को कभी भी गुणा नहीं करना चाहिए क्योंकि आपको सटीक संख्याओं को सटीक संख्याओं के साथ नहीं मिलाना चाहिए; परिणाम अक्षम्य होगा। दूसरे शब्दों में, सटीक संख्याओं की प्रणाली में, .175 जैसे मूल्य कभी मौजूद नहीं होंगे, और इसलिए यह एक गैर-संवेदी गणना है। एक बेहतर समाधान यह है कि 10000 को 175 से गुणा किया जाए और जहाँ उपयुक्त हो एक दशमलव बिंदु को मैन्युअल रूप से डालें।
बैरी ब्राउन

8
@ बैरी - मुझे पता है। मैं आपको प्राप्त होने वाली समस्या के प्रकार का वर्णन करने की कोशिश कर रहा था। इसके अलावा 0.175 जैसे मूल्य मौजूद हैं यदि कर की दर 17.5% है और आपको 10 सेंट की लागत वाली वस्तु पर कर की गणना करने की आवश्यकता है।
ChrisF

1
@acidz ज़ोंबी: पैसे के लिए उपयोग करने का सही प्रकार उच्च (कम से कम 4 दशमलव अंक) परिशुद्धता के साथ एक निश्चित-बिंदु दशमलव है। कोई अगर, और या परंतु नहीं। धन मूल्यों को सेंट के रूप में संग्रहीत करना पर्याप्त नहीं है , क्योंकि व्यवहार में यह आपको केवल दो अंक देता है।
Aaronaught

3

"भगवान ने पूरी संख्याएँ बनाईं, बाकी सब मनुष्य का काम है।" - लियोपोल्ड क्रोनमेकर (1886)।

परिभाषा के अनुसार, आपको किसी अन्य प्रकार की संख्या की आवश्यकता नहीं है । एक प्रोग्रामिंग भाषा के लिए ट्यूरिंग पूर्णता विभिन्न प्रकार की संख्याओं के बीच सरल संबंधों पर आधारित है। यदि आप संपूर्ण संख्याओं (ए / के / एक प्राकृतिक संख्या) के साथ काम कर सकते हैं, तो आप कुछ भी कर सकते हैं।

सवाल कुछ इस तरह का है क्योंकि आपको उनकी ज़रूरत नहीं है। शायद आप ऐसी जगहें चाहते हैं जहाँ यह सुविधाजनक या इष्टतम या सस्ता या कुछ और हो?


7
हम पूरे नंबरों के साथ भी बांट सकते हैं, क्योंकि कोई केवल सेट सिद्धांत संचालन और खाली सेट का उपयोग करके भी उनका निर्माण कर सकता है। लेकिन ट्यूरिंग पूर्णता से बहस और बहस दोनों ही एक हद तक की गई शैक्षणिक कमी है।
बॉब मर्फी

4
इसके अलावा, ट्यूरिंग पूर्णता केवल कंप्यूटिंग पर लागू होती है। न तो पूरी संख्या और न ही तर्कसंगत भी गणितीय रूप से पूर्ण हैं, क्योंकि न तो कॉची अनुक्रमों के अभिसरण के लिए बंद है। तो क्रॉंकर गर्म हवा से भरा था: यदि आप एक पूर्ण मीट्रिक स्थान चाहते हैं जिसमें पूरी संख्याएं शामिल हैं, तो आपको वास्तविक प्राप्त करना होगा: xkcd.com/849
बॉब मर्फी

1
@ याकूब मर्फी: "अकादमिक कमी को चरम पर पहुंचाया"। ठीक। प्रश्न खराब है और इसके संभावित उत्तर की ओर ले जाता है।
:

2

एक वाक्य में, फ़्लोटिंग-पॉइंट दशमलव प्रकार पूर्णांक मानों में रूपांतरण को एन्कैप्सुलेट करता है (जो सभी कंप्यूटर जानता है कि बाइनरी स्तर पर कैसे निपटें? बाइनरी में कोई दशमलव बिंदु नहीं है) एक तार्किक, आम तौर पर आसान-से- प्रदान करता है। दशमलव संख्याओं की गणना के लिए इंटरफ़ेस को समझें।

सच कहूँ, तो आपको फ़्लोट्स की आवश्यकता नहीं है क्योंकि आप जानते हैं कि पूर्णांक का उपयोग करके दशमलव गणित कैसे करना है, यह कहने जैसा है कि आप जानते हैं कि अंकगणितीय लॉन्गहैंड कैसे किया जाता है, इसलिए कैलकुलेटर का उपयोग क्यों करें? तो आप अवधारणा जानते हैं; वाहवाही। इसका मतलब यह नहीं है कि आपको हर समय उस ज्ञान का प्रयोग करना होगा। गैर-बाइनरी-व्हिज़ के लिए अक्सर तेज, सस्ता और अधिक समझ में आता है, सिग अंजीर को पूर्णांक मात्रा में परिवर्तित करने के बजाय केवल 3.5 + 4.6 = 8.1।


1

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

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

संयोग से, फिक्स्ड-पॉइंट गणित 32-बिट वाले की तुलना में 8-बिट और 16-बिट प्रोसेसर के साथ अधिक लाभप्रद था। 8-बिट प्रोसेसर पर, ऐसी स्थिति में जहां 32 बिट्स पर्याप्त पर्याप्त नहीं होंगे, 40-बिट प्रकार में केवल 25% अधिक स्थान होगा और 32-बिट प्रकार की तुलना में 25-50% अधिक समय होगा, और इसके लिए 37.5% की आवश्यकता होगी 64-बिट प्रकार की तुलना में कम स्थान और 37.5-60% कम समय। 32-बिट प्लेटफ़ॉर्म पर, यदि 32-बिट प्रकार किसी चीज़ के लिए पर्याप्त नहीं होगा, तो अक्सर 64 बिट्स से कम किसी भी चीज़ का उपयोग करने का बहुत कम कारण होता है। यदि 48-बिट निश्चित-बिंदु प्रकार पर्याप्त होगा, तो 64-बिट "डबल" काम करेगा और साथ ही निश्चित-बिंदु प्रकार भी होगा।


0

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

double average(List<Double> data) {
  double ans = 0;
  for(Double d : data) {
    ans += d;
  }
  return ans / data.size();
}

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

व्यक्तिगत रूप से, मुझे लगता है कि आपको केवल उनका उपयोग करना चाहिए जब: क) गणना वास्तव में तेज होनी चाहिए; बी) आपको परवाह नहीं है कि परिणाम बंद होने की संभावना है (जब तक आप वास्तव में नहीं जानते कि आप क्या कर रहे हैं)।


-1

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

आज के वास्तुशिल्प (लगभग) की एक पूर्णांक पूर्णांक श्रेणी है +/- 2,147,483,647 (32 बिट) या +/- 9,223,372,036,854,775,807 (64 बिट)। अनसाइन्ड फैली हुई है कि 2 के कारक से।

IEEE 754 फ़्लोट्स (लगभग) +/- 1.4 × 10 ^ 3.445 से 3.4 × 10 ^ 38 तक जाते हैं। डबल फैली हुई है, जो बहुत सारी स्थितियों और बारीकियों के साथ +/- 5 × 1024324 × 2.225 × 10 ^ −308 तक फैली हुई है।

बेशक, सबसे आश्चर्यजनक रूप से स्पष्ट कारण यह है कि आपको -0 ;-) का प्रतिनिधित्व करने की आवश्यकता हो सकती है


संख्या मुख्य रूप से विकिपीडिया लेखों से होती है और इसका अर्थ होता है कि यह चित्रमय है। -0 को छोड़कर, यह सिर्फ मनोरंजन के लिए है।
स्टीफन

समस्या यह है कि उस विशाल रेंज में बहुत सारे पूर्णांक हैं जो बिल्कुल भी प्रतिनिधित्व नहीं करते हैं।
बैरी ब्राउन

@BarryBrown बिल्कुल सही। "बहुत सी स्थितियाँ और बारीकियाँ छोड़ दी गईं" हालाँकि।
स्टीफन

-1

सामान्य कारण यह है कि वे तेज़ हैं क्योंकि जेवीएम आमतौर पर अंतर्निहित हार्डवेयर समर्थन का उपयोग करता है (जब तक कि आप सख्त उपयोग नहीं करते हैं)।

Https://tackoverflow.com/questions/517915/when-to-use-strictfp-keyword-in-java देखें कि क्या सख्त का तात्पर्य है।


फ्लोटिंग पॉइंट गणित पूर्णांक गणित से तेज है? किस प्रोसेसर पर फ्लोटिंग पॉइंट गणना पूर्णांक गणनाओं की तुलना में कम चक्र लेती है?
यह.जोश

1
@ this.josh, आपके अंकों में आपके अंकों की संख्या पर बहुत अधिक निर्भर करता है। इसके अलावा पूर्णांक ठीक से विभाजित नहीं हो सकते हैं जो महत्वपूर्ण हो सकते हैं या नहीं।

-2

इसलिए हमें 256bit ऑपरेटिंग सिस्टम की आवश्यकता है।

तख़्त की लंबाई (सबसे छोटी दूरी जिसे आप माप सकते हैं) = 10 ^
-35 मीटर अवलोकनीय ब्रह्मांड 14Bn पारसेक है = 10 ^ 25m
तो आप पूर्णांक के रूप में प्लैंक लंबाई की इकाइयों में कुछ भी माप सकते हैं यदि आप केवल 200 बिट्स सटीक हैं।


2
-1: क्या होगा यदि आप ऑब्जर्वेबल ब्रह्मांड से बड़े पैमाने पर चीजों का अनुकरण कर रहे हैं?
अमारा

2
@sparkleshy, कि एफएआर संकेत क्या हैं!
मार्टिन बेकेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.