कंप्यूटर एक दूसरे पूरे नंबर के रूप में दशमलव संख्याओं को संग्रहीत क्यों नहीं करते हैं?


24

कंप्यूटरों को भिन्नात्मक संख्याओं को संग्रहीत करने में परेशानी होती है, जहाँ हर 2 x के समाधान के अलावा कुछ होता है। ऐसा इसलिए है क्योंकि दशमलव के बाद का पहला अंक 1/2, दूसरा 1/4 (या 1 / (2 ^ 1) और 1 / (2 ^ 2) आदि है।

जब कंप्यूटर केवल संख्या के दशमलव भाग को किसी अन्य संपूर्ण संख्या के रूप में संग्रहीत कर सकता है (जो कि सटीक है तो) सभी प्रकार की चक्करदार त्रुटियों से क्यों निपटें?

केवल एक चीज जिसके बारे में मैं सोच सकता हूं, वह दोहराव के साथ काम कर रही है (बेस 10 में), लेकिन इसके लिए एक किनारे समाधान हो सकता है (जैसे कि वर्तमान में हमारे पास अनन्तता है)।


8
आपको यह देखना चाहिए कि फ़्लोट / डबल प्रकार के विपरीत दशमलव प्रकार कैसे संग्रहीत किए जाते हैं।
ऊद

9
पता नहीं कैसे यह किसी भी अधिक सटीक है। दशमलव के बाद पहला अंक 1/10 है दूसरा 1/100 आदि। कैसे कोई और सटीक आप अभी भी गोल समस्याएं प्राप्त करते हैं (आप 1/3 का प्रतिनिधित्व कैसे करते हैं)? एकमात्र अंतर यह है कि कौन से मूल्यों का प्रतिनिधित्व किया जा सकता है।
मार्टिन यॉर्क

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

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

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

जवाबों:


35

वास्तव में संख्याओं के मोड हैं जो ऐसा करते हैं।

द्विआधारी-कोडित दशमलव (बीसीडी) अंकगणित में कंप्यूटर का काम आधार 10 है। आपके द्वारा इस कारण से चलाने का कारण यह है कि यह शायद ही कभी अंतरिक्ष को बर्बाद करता है: संख्या के प्रत्येक व्यक्तिगत अंक में न्यूनतम चार बिट्स लगते हैं, जबकि एक कंप्यूटर अन्यथा स्टोर कर सकता है। उस जगह में 16 मान। (यह धीमा भी हो सकता है, लेकिन हार्डवेयर-त्वरित बीसीडी गणित है जो ठीक काम करता है।)। यह वास्तव में, वास्तव में सबसे अधिक कैलकुलेटर क्या करता है, यही कारण है कि गोलाई समस्याओं के कुछ वर्ग हैं जिन्हें आप $ 5 कैसियो पर कभी नहीं मारेंगे जो आपके दोपहर के भोजन को डेस्कटॉप कंप्यूटर पर खाएंगे।

दूसरा मार्ग जो आप ले सकते हैं, वह है तर्कसंगत संख्याओं का उपयोग करना - अर्थात, एक अंश और एक भाजक, पूर्णांक के रूप में संग्रहीत। यह वास्तव में लगभग सभी भाषाओं में उपलब्ध है, सटीक है, और आपको मूल बाइनरी प्रारूपों में सब कुछ संग्रहीत करने की अनुमति देता है। समस्या यह है कि, दिन के अंत में, उपयोगकर्ता संभवत: 463/13 जैसे अंश नहीं देखना चाहते, न ही 35 और 8/13। वे 35.615 देखना चाहते हैं ... और जिस क्षण आप वहां पहुंचते हैं, आप सभी विशिष्ट समस्याओं का सामना करते हैं। इसमें जोड़ें कि यह प्रारूप और भी अधिक स्थान लेता है, और फ्लोटिंग पॉइंट अंकगणित की तुलना में काफी धीमा हो सकता है, और आप पाएंगे कि कोई भी कंप्यूटर डिफ़ॉल्ट रूप से इस प्रारूप का उपयोग नहीं करता है।

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


क्या आपका मतलब बीसीडी पैराग्राफ में चार बिट्स (बाइट्स नहीं) है?

3
अन्य विकल्प निश्चित बिंदु अंकगणित है, जहां एक पूर्णांक एक दशमलव अंश का प्रतिनिधित्व करता है यदि संख्या - उदाहरण के लिए धन मान (दशमलव या प्रतिशत शामिल गणना के बिना) जहां 1 $ 0.01 का प्रतिनिधित्व करता है।
मटनज़

1
@ मट्टनज़: ट्रू-फिक्स्ड-पॉइंट्स तर्कसंगत होने का एक विशेष मामला है।
जॉन पुरडी

बहुत बढ़िया, पता नहीं था कि कैलकुलेटर ने ऐसा किया था।
SomeKittens

3
एक तीसरा विकल्प है। दशमलव घातांक के साथ फ्लोटिंग पॉइंट, जैसे कि C # कैसे decimalलागू किया जाता है: stackoverflow.com/a/5019178/174335 यह BCD नहीं है क्योंकि दशमलव अंकों का कोई व्यक्तिगत प्रतिनिधित्व नहीं है, और यह निश्चित बिंदु नहीं है।
जोरन

38

आंशिक संख्याओं को संग्रहीत करने के कई तरीके हैं, और उनमें से प्रत्येक के फायदे और नुकसान हैं।

फ्लोटिंग-पॉइंट , अब तक का सबसे लोकप्रिय प्रारूप है। यह एक साइन, एक मंटिसा, और एक हस्ताक्षरित बेस -2 घातांक को पूर्णांक में एन्कोडिंग और उन्हें बिट्स के एक गुच्छा में पैक करके काम करता है। उदाहरण के लिए, आप में से एक 32-बिट अपूर्णांश हो सकता था 0.5(के रूप में एन्कोड 0x88888888) और एक 32-बिट पर हस्ताक्षर किए प्रतिपादक +3( 0x00000003) है, जो करने के लिए डिकोड हैं 4.0(0.5 * 2 ^ 3)। फ़्लोटिंग-पॉइंट नंबर तेज़ हैं, क्योंकि वे हार्डवेयर में कार्यान्वित किए जाते हैं, और उनका सटीक माप पूर्ण आकार के साथ होता है, यानी संख्या जितनी छोटी होगी, आपकी पूर्ण परिशुद्धता बेहतर होगी, इसलिए सापेक्ष गोलाई त्रुटि पूर्ण आकार के साथ स्थिर रहती है। फ़्लोट्स निरंतर डोमेन से लिए गए मानों के लिए उत्कृष्ट होते हैं, जैसे कि लंबाई, ध्वनि दबाव स्तर, प्रकाश स्तर, आदि, और उसके कारण, वे आमतौर पर ऑडियो और छवि प्रसंस्करण में उपयोग किए जाते हैं, साथ ही सांख्यिकीय विश्लेषण और भौतिकी सिमुलेशन भी। उनका सबसे बड़ा नकारात्मक पक्ष यह है कि वे सटीक नहीं हैं, अर्थात्, वे गोल त्रुटियों के लिए प्रवण हैं, और वे सभी दशमलव अंशों का सही प्रतिनिधित्व नहीं कर सकते हैं। सभी मुख्यधारा की प्रोग्रामिंग भाषाओं में किसी प्रकार का एक फ्लोट बिंदु होता है।

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

दशमलव प्रकार बहुत काम करते हैं जैसे फ़्लोट्स या फिक्स्ड-पॉइंट नंबर, लेकिन वे एक दशमलव प्रणाली मान लेते हैं, अर्थात, उनके प्रतिपादक (अंतर्निहित या स्पष्ट) पावर-ऑफ -10 को एनकोड करते हैं, न कि पावर -२ के। एक दशमलव संख्या, उदाहरण के लिए, 23456और इसके एक घातांक को सांकेतिक शब्दों में बदलना कर सकती है -2, और इसका विस्तार होगा234.56। दशमलव, क्योंकि अंकगणित सीपीयू में हार्ड-वायर्ड नहीं होता है, तैरने की तुलना में धीमा होता है, लेकिन वे किसी भी चीज के लिए आदर्श होते हैं जिसमें दशमलव संख्याएं शामिल होती हैं और उन संख्याओं को सटीक होने की आवश्यकता होती है, जो अच्छी तरह से परिभाषित स्थानों में होने वाली गोलाई के साथ होती हैं - वित्तीय छूट, स्कोरबोर्ड इत्यादि, कुछ प्रोग्रामिंग भाषाओं में दशमलव प्रकार बनाए गए हैं (जैसे C #), दूसरों को उन्हें लागू करने के लिए पुस्तकालयों की आवश्यकता होती है। ध्यान दें कि जबकि दशमलव गैर-दोहराए जाने वाले दशमलव अंशों का सही प्रतिनिधित्व कर सकता है, उनकी सटीकता फ्लोटिंग-पॉइंट संख्याओं से बेहतर नहीं है; दशमलव का चयन करने का मतलब है कि आपको उन संख्याओं का सटीक निरूपण मिलता है, जिन्हें एक दशमलव प्रणाली में ठीक-ठीक दर्शाया जा सकता है (जैसे तैरने वाले बिल्कुल द्विआधारी अंश का प्रतिनिधित्व कर सकते हैं)।

परिमेय संख्या एक अंश और एक संचयक को संग्रहीत करती है, आमतौर पर कुछ प्रकार के बिग्नम पूर्णांक प्रकार (एक संख्यात्मक प्रकार जो कंप्यूटर की मेमोरी बाधाओं की अनुमति के रूप में बड़े हो सकते हैं) का उपयोग करते हैं। यह बंच से बाहर एकमात्र डेटा प्रकार है जो सटीक रूप से मॉडल संख्याओं की तरह 1/3या 3/17साथ ही उन पर संचालन कर सकता है - तर्कसंगत, अन्य डेटा प्रकारों के विपरीत, जैसी चीजों के लिए सही परिणाम देगा3 * 1/3। गणित बहुत सीधा है, हालांकि एक कुशल फैक्टरिंग एल्गोरिथ्म के साथ आना चुनौतीपूर्ण है। कुछ प्रोग्रामिंग भाषाओं में तर्कसंगत प्रकार बनाए गए हैं, जैसे (कॉमन लिस्प)। परिमेय के डाउनसाइड्स में यह शामिल है कि वे धीमे हैं (कई परिचालनों में अंशों को कम करने और उनके घटकों को तथ्यात्मक बनाने की आवश्यकता होती है), और यह कि कई सामान्य परिचालनों को लागू करना कठिन या असंभव है, और अधिकांश क्रियान्वयन तर्कसंगत होने पर एक नाव पर गिर जाएगा जब ऐसा होता है (जैसे जब आप कॉल करते हैं) sin()तर्कसंगत पर)।

बीसीडी (बाइनरी कोडेड डेसीमल) व्यक्तिगत अंकों को एनकोड करने के लिए "नीबल्स" (4 बिट्स के समूह) का उपयोग करता है; चूंकि एक कुतरना 16 अलग-अलग मूल्यों को धारण कर सकता है, लेकिन दशमलव संख्या में केवल 10 की आवश्यकता होती है, प्रति कुतरना 6 "अवैध" मान हैं। दशमलव की तरह, बीसीडी नंबर दशमलव-सटीक होते हैं, अर्थात, दशमलव संख्याओं पर की गई गणना ठीक उसी तरह से काम करती है जैसे आप उन्हें पेन और पेपर का उपयोग करके करते हैं। बीसीडी के लिए अंकगणितीय नियम कुछ अनाड़ी हैं, लेकिन उल्टा यह है कि उन्हें स्ट्रिंग्स में बदलना कुछ अन्य प्रारूपों की तुलना में आसान है, जो एम्बेडेड सिस्टम जैसे कम संसाधन वाले वातावरण के लिए विशेष रूप से दिलचस्प है।

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


निश्चित रूप से 32-बिट फिक्स्ड पॉइंट में 32-बिट फ़्लोटिंग पॉइंट की तुलना में अधिक सटीकता होती है, क्योंकि फिक्स्ड पॉइंट रिप्रेज़ेंटेशन में मंटिसा शामिल नहीं होता है।
हान

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

@ जरूरी नहीं, दोनों अभी भी 2 ^ 32 अलग-अलग मूल्यों का प्रतिनिधित्व कर सकते हैं। प्रस्तुति की परवाह किए बिना, जानकारी की मात्रा समान है। रेंज और सटीक हाथ में हाथ हालांकि, तो उस संबंध में निश्चित बिंदु अंकगणित कुछ सीमाओं में अधिक सटीक हो सकता है। और गंदा यादृच्छिक दौर मुद्दों से बचा जाता है, अगर आप उन सीमाओं को जानते हैं जिनके साथ आप काम कर सकते हैं।
zxcdw 10

@han: उनके पास एक ही सटीकता (या लगभग) है। अंतर यह है कि फिक्स्ड-पॉइंट नंबरों के लिए, सटीक (जैसा कि एक नंबर से उसके उत्तराधिकारी के लिए असतत कदम के आकार में) स्थिर है, जैसे पूर्णांक के साथ, जबकि फ्लोट के साथ, यह निरपेक्ष रूप से निरपेक्ष मान के साथ बढ़ता है - फ्लोट संख्या 1.0 इसकी संख्या 10,000,000.0 (लगभग एक लाख गुना अधिक, मोटे तौर पर) की तुलना में अधिक सटीक है।
तदममार

6

फ्लोटिंग पॉइंट नंबर मूल्यों की एक विशाल श्रृंखला का प्रतिनिधित्व करते हैं, जो तब बहुत उपयोगी होता है जब आपके समय से पहले नहीं पता होता है कि मूल्य क्या हो सकते हैं, लेकिन यह एक समझौता है। एक दूसरे पूर्णांक के साथ 1/10 ^ 100 का प्रतिनिधित्व करना काम नहीं करेगा।

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

आपको समस्या डोमेन के लिए उपयुक्त अपनी संख्या प्रतिनिधित्व का चयन करना होगा।


1

ऐसा लगता है कि आप निश्चित-बिंदु संख्याओं का वर्णन कर रहे हैं ।

इस बात को ध्यान में रखें कि एक अलग स्थान में किसी संख्या के भिन्नात्मक भाग को संचय करना एक एकल स्थान बनाने के लिए ठीक समान है, दो बार लंबे समय तक, और दो अलग हिस्सों में पूरे और भिन्नात्मक भाग को संग्रहीत करना। दूसरे शब्दों में, यह संख्या को पूर्णांक के रूप में संग्रहीत करने के समान है लेकिन बस दशमलव स्थानों की एक निश्चित संख्या मान रहा है।

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


1

इसे BCD कहा जाएगा, मुझे लगता है कि आप अभी भी इसका उपयोग कर सकते हैं यदि आप वास्तव में करना चाहते हैं। हालांकि यह वास्तव में इसके लायक नहीं है:

  1. आप 64 बिट फ़्लोटिंग पॉइंट के साथ बहुत मुश्किल से एक राउंडिंग त्रुटि में भाग लेंगे
  2. यह अंकगणित को जटिल और अक्षम बनाता है
  3. यह हर 4 बिट्स पर 6 मान बर्बाद करता है

8-बिट माइक्रोप्रोसेसर सिस्टम पर बीसीडी गणित का बहुत उपयोग किया गया था; वास्तव में, एक लोकप्रिय माइक्रोप्रोसेसर (6502) पर, बीसीडी के साथ जोड़ और घटाव बाइनरी के अनुसार प्रति बाइट के रूप में तेजी से होते हैं। वीडियो गेम्स अक्सर स्कोर रखने के लिए बीसीडी गणित का इस्तेमाल करते थे। 1,000,000 अंकों पर रैपिंग के लिए कोई विशेष हैंडलिंग नहीं है। इसके बजाय, एक ले जाने के साथ 1 "99 99 99" पैदावार "00 00 00" को जोड़ा जाता है जिसे अनदेखा किया जाता है। BCD में स्कोर जोड़ने का अतिरिक्त ओवरहेड एक द्विआधारी मान को प्रदर्शित करने योग्य प्रारूप में परिवर्तित करने की लागत की तुलना में छोटा है।
सुपरकट

1

संक्षिप्त उत्तर यह है कि फ्लोटिंग पॉइंट को वैज्ञानिक गणना के लिए डिज़ाइन किया गया था। यह एक संख्या को (ऊपर) एक निर्दिष्ट संख्या में महत्वपूर्ण अंकों के साथ संग्रहीत कर सकता है, जो कि अधिकांश वैज्ञानिक गणनाओं में सटीकता को कैसे मापा जाता है, इसके साथ फिट बैठता है।

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

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