दशमलव संख्याओं को बाइनरी में बिल्कुल क्यों नहीं दर्शाया जा सकता है?


284

फ्लोटिंग-पॉइंट प्रतिनिधित्व के बारे में SO को कई प्रश्न पोस्ट किए गए हैं। उदाहरण के लिए, दशमलव संख्या 0.1 में एक सटीक द्विआधारी प्रतिनिधित्व नहीं है, इसलिए यह == ऑपरेटर का उपयोग करने के लिए इसे दूसरे फ़्लोटिंग-पॉइंट नंबर से तुलना करना खतरनाक है। मैं फ़्लोटिंग-पॉइंट प्रतिनिधित्व के पीछे के सिद्धांतों को समझता हूं।

मुझे समझ में नहीं आता है कि, गणितीय दृष्टिकोण से, दशमलव बिंदु के दाईं ओर संख्याएं "विशेष" हैं जो बाईं ओर हैं?

उदाहरण के लिए, संख्या 61.0 में एक सटीक बाइनरी प्रतिनिधित्व है क्योंकि किसी भी संख्या का अभिन्न अंग हमेशा सटीक होता है। लेकिन 6.10 की संख्या सटीक नहीं है। मैंने किया था दशमलव एक जगह ले जाया गया और अचानक मैं Exactopia से Inexactville चला गया। गणितीय रूप से, दो संख्याओं के बीच कोई आंतरिक अंतर नहीं होना चाहिए - वे सिर्फ संख्याएँ हैं।

इसके विपरीत, यदि मैं दशमलव संख्या को 610 की संख्या का उत्पादन करने के लिए दूसरी दिशा में ले जाता हूं, तो मैं अभी भी एक्सेप्टोपिया में हूं। मैं उस दिशा में जा रहा हूँ (6100, 610000000, 610000000000000) और वे अभी भी सटीक, सटीक, सटीक हैं। लेकिन जैसे ही दशमलव कुछ सीमा पार करता है, संख्याएं अब सटीक नहीं हैं।

क्या चल रहा है?

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

... 1000  100   10    1   1/10  1/100 ...

बाइनरी में, वे होंगे:

... 8    4    2    1    1/2  1/4  1/8 ...

इन नंबरों पर कोई मनमानी सीमा नहीं है। स्थिति अनिश्चित रूप से बाईं ओर और दाईं ओर बढ़ती है।


2
आपको यह समझने में मदद मिल सकती है कि फ्लोटिंग पॉइंट नम्बर के अंदर क्या हो रहा है: एक फ्लोटिंग पॉइंट नंबर का एनाटॉमी
जॉन डी। कुक

57
बाइनरी में, संख्या 3 को 2¹ + 2 ° = 2 + 1 के रूप में दर्शाया गया है। अच्छा और आसान। अब, 1/3 पर एक नज़र डालें। 2 की नकारात्मक शक्तियों का उपयोग करके आप इसे कैसे दर्शाएंगे? थोड़ा प्रयोग करें और आप देखेंगे कि 1/3 अनंत अनुक्रम 2 ^ -2 + 2 ^ -4 + 2 ^ -6 + 2 ^ -8 + ... के योग के बराबर है। बाइनरी में सटीक प्रतिनिधित्व करना इतना आसान नहीं है।
लार्स हग्सथ

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

3
ऐसी कई प्रणालियाँ हैं जिनका सटीक दशमलव निरूपण है। यह बहुत काम करता है जैसे आप वर्णन करते हैं। SQL दशमलव प्रकार एक उदाहरण है। LISP भाषाओं ने इसे बनाया है। सटीक दशमलव गणना का उपयोग करने के लिए कई वाणिज्यिक और ओपनसोर्स लाइब्रेरी हैं। यह सिर्फ इतना है कि इसके लिए कोई हार्डवेयर समर्थन नहीं है, और सिर्फ अधिकांश भाषाओं और हार्डवेयर में 32 या 64 बिट्स में अनंत संख्या का प्रतिनिधित्व करने के लिए IEEE मानकों को लागू करता है।
nos

1
यह सवाल इसलिए है क्योंकि यह गणित के बारे में (यह संबंधित गणित प्रोग्रामिंग भले ही) है और पर बेहतर होगा विषय बंद हो गया लगता है गणित
कोल जॉनसन

जवाबों:


360

यदि आपके पास पर्याप्त स्थान है, तो दशमलव संख्याओं का सटीक रूप से प्रतिनिधित्व किया जा सकता है - बस फ्लोटिंग बाइनरी पॉइंट नंबरों द्वारा नहीं । यदि आप फ़्लोटिंग दशमलव बिंदु प्रकार (जैसे System.Decimal.NET में) का उपयोग करते हैं तो बहुत सारे मान जिन्हें बाइनरी फ़्लोटिंग पॉइंट में ठीक से प्रस्तुत नहीं किया जा सकता है।

आइए इसे दूसरे तरीके से देखें - बेस 10 में, जिसके साथ आप सहज होने की संभावना रखते हैं, आप ठीक 1/3 व्यक्त नहीं कर सकते। यह 0.3333333 है ... (आवर्ती)। जिस कारण से आप 0.1 का प्रतिनिधित्व नहीं कर सकते हैं क्योंकि बाइनरी फ्लोटिंग पॉइंट नंबर बिल्कुल उसी कारण से है। आप 3, और 9, और 27 का प्रतिनिधित्व कर सकते हैं - लेकिन 1/3, 1/9 या 1/27 नहीं।

समस्या यह है कि 3 एक अभाज्य संख्या है जो 10. का कारक नहीं है। यह एक समस्या नहीं है जब आप किसी संख्या को 3 से गुणा करना चाहते हैं : आप समस्याओं में भागे बिना हमेशा पूर्णांक से गुणा कर सकते हैं। लेकिन जब आप एक संख्या से विभाजित होते हैं जो कि प्रमुख है और आपके आधार का कारक नहीं है, तो आप मुसीबत (और इच्छा) में भाग सकते हैं यदि आप उस संख्या से 1 को विभाजित करने का प्रयास करते हैं तो ऐसा )।

हालाँकि आमतौर पर 0.1 का उपयोग एक सटीक दशमलव संख्या के सबसे सरल उदाहरण के रूप में किया जाता है, जिसे बाइनरी फ्लोटिंग पॉइंट में बिल्कुल प्रतिनिधित्व नहीं किया जा सकता है, यकीनन 0.2 एक सरल उदाहरण है क्योंकि यह 1/5 है - और 5 वह प्रमुख है जो दशमलव और बाइनरी के बीच समस्याओं का कारण बनता है ।


परिमित अभ्यावेदन की समस्या से निपटने के लिए साइड नोट:

कुछ फ़्लोटिंग दशमलव बिंदु प्रकारों का एक निश्चित आकार होता है जैसे कि System.Decimalअन्य java.math.BigDecimalलोग "मनमाने ढंग से बड़े" होते हैं - लेकिन वे कुछ बिंदु पर एक सीमा से टकराएंगे, चाहे वह सिस्टम मेमोरी हो या किसी सरणी का सैद्धांतिक अधिकतम आकार। यह इस उत्तर के मुख्य एक के लिए एक पूरी तरह से अलग बिंदु है, हालांकि। यहां तक ​​कि अगर आपके पास खेलने के लिए वास्तव में बड़ी संख्या में बिट्स हैं, तो आप अभी भी एक अस्थायी द्विआधारी प्रतिनिधित्व प्रतिनिधित्व में दशमलव 0.1 का प्रतिनिधित्व नहीं कर सकते हैं। दूसरे तरीके के साथ तुलना करें: दशमलव अंकों की एक मनमानी संख्या को देखते हुए, आप वास्तव में किसी भी संख्या का प्रतिनिधित्व कर सकते हैं जो कि फ्लोटिंग बाइनरी पॉइंट के रूप में बिल्कुल प्रतिनिधित्व योग्य है।


8
यह एक बहुत अच्छा उदाहरण है सर!
टॉम रिटर

5
... काश मैं इसे दो बार बढ़ा पाता। मुझे इस बारे में पूरी तरह से कई बार पूछा गया है। यह लगभग ऐसा है जैसे लोग आधार के बाहर नहीं सोच सकते हैं।
हेह

38
हाँ, दुनिया में 10 तरह के लोग हैं - जो बाइनरी को समझते हैं और जो नहीं करते हैं।
duffymo

83
@JonSkeet: Ctrl + Alt + Delete सिर्फ दो उंगलियों के साथ अजीब लगेगा।
लार्स हग्सथ

20
@muusbolla: नहीं। दशमलव प्रतिनिधित्व 1और दशमलव प्रतिनिधित्व द्वारा प्रदर्शित संख्या 0.9...( 9दशमलव बिंदु के बाद असीम रूप से दोहराए जाने वाले एस) बराबर हैं। शायद इसे देखने का सबसे आसान तरीका निम्नलिखित है: लेट x = 0.9...। ध्यान दें 10x = 9.9....। इसलिए 9x = 10x - x = 9.9... - 0.9... = 9ताकि 9x = 9और x = 1। इसे देखने के अन्य तरीके हैं, लेकिन मेरा मानना ​​है कि यह सबसे सरल है।
जेसन

25

उदाहरण के लिए, संख्या 61.0 में एक सटीक द्विआधारी प्रतिनिधित्व है क्योंकि किसी भी संख्या का अभिन्न अंग हमेशा सटीक होता है। लेकिन 6.10 की संख्या सटीक नहीं है। मैंने किया था दशमलव एक जगह ले जाया गया और अचानक मैं Exactopia से Inexactville चला गया। गणितीय रूप से, दो संख्याओं के बीच कोई आंतरिक अंतर नहीं होना चाहिए - वे सिर्फ संख्याएँ हैं

आइए आधार 10 और 2 के विवरणों से एक पल के लिए दूर हो जाएं। आइए पूछते हैं - आधार में b, क्या संख्याएँ निरूपण निरूपण हैं, और क्या संख्या नहीं है? एक पल का विचार हमें बताता है कि किसी संख्या xमें एक समाप्ति- bव्याख्या प्रस्तुत की जाती है यदि और केवल तभी कोई पूर्णांक मौजूद हो nजैसे कि x b^nपूर्णांक।

इसलिए, उदाहरण के लिए, x = 11/500एक समाप्ति 10-प्रतिनिधित्व है, क्योंकि हम चुन सकते हैं n = 3और फिर x b^n = 22, एक पूर्णांक। हालाँकि x = 1/3ऐसा नहीं है, क्योंकि nहम जो भी चुनते हैं वह 3 से छुटकारा पाने में सक्षम नहीं होगा।

यह दूसरा उदाहरण संकेतों हमें कारकों के बारे में सोचने के लिए, और हम देख सकते हैं कि किसी के लिए तर्कसंगत x = p/q (न्यूनतम मान पर माना जाता है), हम के प्रधानमंत्री factorisations की तुलना द्वारा सवाल का जवाब कर सकते हैं bऔर q। यदि qकिसी भी प्रमुख कारक के मुख्य कारक में नहीं है b, तो हम कभी भी nइन कारकों से छुटकारा पाने के लिए उपयुक्त नहीं पाएंगे ।

इस प्रकार आधार 10, के लिए किसी भी p/q जहां qसे कम 2 या 5 एक समाप्त प्रतिनिधित्व नहीं होगा अन्य प्रमुख कारकों है।

तो अब वापस 10 और 2 के आधारों पर जा रहे हैं, हम देखते हैं कि 10-निरूपण को समाप्त करने वाला कोई भी नियम p/qठीक उसी प्रकार का होगा, जब उसके प्रधान कारक में qकेवल 2s और 5s हों; और उसी संख्या में एक टर्मिनेटिंग 2-अभ्यावेदन होगा, जब qकेवल 2अपने मुख्य कारक में s है।

लेकिन इन मामलों में से एक दूसरे का सबसेट है! जब कभी

qकेवल 2अपने मुख्य कारक में है

यह स्पष्ट रूप से सच भी है

qकेवल अपने प्रमुख कारक में 2s है और 5s है

या, एक और तरीका है, जब p/qभी एक समाप्ति 2-प्रतिनिधित्व है, p/qएक समाप्ति 10-प्रतिनिधित्व है । बातचीत तथापि करता नहीं पकड़ - जब भी qअपने प्रधानमंत्री गुणनखंड में एक 5 है, यह एक को समाप्त 10 प्रतिनिधित्व है, लेकिन करना होगा नहीं एक समाप्त 2-प्रतिनिधित्व। यह 0.1अन्य उत्तरों द्वारा उल्लिखित उदाहरण है।

इसलिए हमारे पास आपके प्रश्न का उत्तर है - क्योंकि 2 के प्रमुख कारक 10 के प्रमुख कारकों में से एक सबसेट हैं, सभी 2-टर्मिनेटिंग नंबर 10-टर्मिनेटिंग नंबर हैं, लेकिन इसके विपरीत नहीं। यह 61 बनाम 6.1 के बारे में नहीं है - यह लगभग 10 बनाम 2 है।

समापन नोट के रूप में, अगर कुछ क्वर्की लोगों ने आधार 17 (लेकिन) का उपयोग किया है, लेकिन हमारे कंप्यूटरों ने आधार 5 का उपयोग किया है, तो आपका अंतर्ज्ञान कभी भी इस मार्ग से भटक नहीं जाएगा - कोई (गैर-शून्य, गैर-पूर्णांक) संख्या नहीं होगी जो समाप्त हो गई है दोनों मामलों में!


तो फिर "अलर्ट (0.15 * 0.15)" डिस्प्ले "0.0225" क्यों करता है?
माइकल गेइसर

5
@MichaelGeiser संक्षिप्त उत्तर: प्रदर्शन के बिंदु पर गोलाई। आपको लगता है 0.15कि वास्तव में (आईईईई डबल के रूप में संग्रहीत) `0.149999999999999994448884876874` है। Jsfiddle देखें ।
आकाशवाणी

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

1
@MichaelGeiser बेस 2 के साथ काम करने के लिए सर्किट छोटे, तेज़, और आधार के साथ काम करने के लिए लोगों की तुलना में अधिक शक्ति कुशल हैं। आज हम ओवरहेड को सही ठहराने में सक्षम हो सकते हैं, लेकिन 1970 के दशक में जब मानक निर्धारित किए जा रहे थे, यह एक था। बड़ी बात। प्रोसेसर सर्किटरी के सीधे समर्थन के बिना इसे करने की कोशिश करना और भी बदतर है, गति में अंतर के आदेशों की अपेक्षा करें।
मार्क रैनसम

यह जवाब जॉन स्कीट से बेहतर बताते हैं!
गोइलाकाश

16

मूल (गणितीय) कारण यह है कि जब आप पूर्णांकों के साथ काम कर रहे होते हैं, तो वे अनगिनत रूप से अनंत होते हैं

जिसका अर्थ है, भले ही उनमें से एक अनंत राशि हो, हम बिना किसी को लंघन के, सभी वस्तुओं को अनुक्रम में "गिन" सकते हैं। इसका मतलब है कि अगर हम 610000000000000सूची में वें स्थान पर आइटम प्राप्त करना चाहते हैं , तो हम इसे एक सूत्र के माध्यम से समझ सकते हैं।

हालांकि, वास्तविक संख्या बेशुमार अनंत हैं । आप यह नहीं कह सकते कि "मुझे स्थिति में वास्तविक संख्या दें 610000000000000" और एक उत्तर प्राप्त करें। कारण है, क्योंकि दोनों के बीच भी 0और 1, वहाँ मूल्यों की एक अनंत संख्या में हैं, जब आप फ्लोटिंग प्वाइंट मूल्यों पर विचार कर रहे हैं। वही किसी भी दो फ्लोटिंग पॉइंट नंबरों के लिए सही है।

और जानकारी:

http://en.wikipedia.org/wiki/Countable_set

http://en.wikipedia.org/wiki/Uncountable_set

अद्यतन: मेरी क्षमा याचना, मुझे लगता है कि इस प्रश्न का गलत अर्थ निकाला गया है। मेरी प्रतिक्रिया इस बारे में है कि हम हर वास्तविक मूल्य का प्रतिनिधित्व क्यों नहीं कर सकते हैं , मुझे महसूस नहीं हुआ कि फ्लोटिंग पॉइंट को स्वचालित रूप से तर्कसंगत के रूप में वर्गीकृत किया गया है।


6
वास्तव में, परिमेय संख्याओं हैं गणनीय अनंत। लेकिन हर वास्तविक संख्या एक तर्कसंगत संख्या नहीं है। मैं निश्चित रूप से सटीक दशमलव संख्याओं के अनुक्रम का उत्पादन कर सकता हूं जो किसी भी सटीक दशमलव संख्या तक पहुंच जाएगा जो आप अंततः मुझे देना चाहते हैं। यदि आपको तर्कहीन संख्याओं से निपटने की आवश्यकता है, तो आप अनजाने अनंत सेटों में पहुंच सकते हैं।
जॉन स्कीट

सच है, मुझे "वास्तविक" कहना चाहिए, न कि "फ्लोटिंग-पॉइंट"। स्पष्ट करेंगे।
टीएम।

1
जिस बिंदु पर तर्क कम लागू होता है, IMO - क्योंकि न केवल हम बाइनरी फ़्लोटिंग पॉइंट का उपयोग करके सभी वास्तविक संख्याओं के साथ सौदा नहीं कर सकते हैं, बल्कि हम सभी तर्कसंगत संख्याओं (जैसे 0.1) से भी निपट नहीं सकते हैं । दूसरे शब्दों में, मुझे नहीं लगता कि यह वास्तव में काउंटिबिलिटी के साथ करना है :)
जॉन स्कीट

@jonskeet मुझे पता है कि जॉन स्कीट के साथ असहमत होना प्रकृति के एक मौलिक नियम को तोड़ देगा, इसलिए निश्चित रूप से मैं ऐसा नहीं करूंगा :) हालांकि, मुझे लगता है कि संख्याओं के आंतरिक प्रतिनिधित्व को सूचक के रूप में सोचना ठीक है उन मूल्यों का सेट जो आप बाह्य रूप से प्रस्तुत करना चाहते हैं। इस विचारधारा के साथ, आप देख सकते हैं कि आपके सूचकांकों की सूची चाहे कितनी भी बड़ी हो (भले ही आपने कहा था, परिशुद्धता के अनंत टुकड़े), आप अभी भी सभी वास्तविक संख्याओं का प्रतिनिधित्व नहीं कर पाएंगे।
टीएम।

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

10

श्री स्कीट ने अपनी टिप्पणी में जो कहा था उसे दोहराने के लिए: हम 1/3, 1/9, 1/27 या दशमलव संकेतन में किसी भी तर्कसंगत का प्रतिनिधित्व कर सकते हैं । हम इसे एक अतिरिक्त प्रतीक जोड़कर करते हैं। उदाहरण के लिए, अंकों की एक पंक्ति जो संख्या के दशमलव विस्तार में दोहराती है। द्विआधारी संख्याओं के अनुक्रम के रूप में हमें दशमलव संख्याओं का प्रतिनिधित्व करने की क्या आवश्यकता है 1) द्विआधारी संख्याओं का एक क्रम, 2) एक मूलांक बिंदु, और 3) अनुक्रम के दोहराए गए भाग को इंगित करने के लिए कुछ अन्य प्रतीक हैं।

हेहनर का उद्धरण संकेतन ऐसा करने का एक तरीका है। वह अनुक्रम के दोहराए गए भाग का प्रतिनिधित्व करने के लिए एक उद्धरण चिन्ह का उपयोग करता है। लेख: http://www.cs.toronto.edu/~hehner/ratno.pdf और विकिपीडिया प्रविष्टि: http://en.wikipedia.org/wiki/Quote_notation

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


यदि हम जानते हैं कि चक्र शुरू होता है और समाप्त होता है तो यह संकेतन प्रणाली काम करती है। साइकिल का पता लगाने में मनुष्य बहुत अच्छा है। लेकिन, सामान्य तौर पर, कंप्यूटर नहीं होते हैं। एक पुनरावृत्ति प्रतीक का प्रभावी ढंग से उपयोग करने में सक्षम होने के लिए, कंप्यूटर को यह पता लगाने में सक्षम होना होगा कि गणना करने के बाद साइकिल कहां हैं। उदाहरण के लिए, संख्या 1/3 के लिए, चक्र तुरंत शुरू होता है। संख्या 1/97 के लिए, चक्र तब तक खुद को नहीं दिखाता जब तक कि आपने कम से कम 96 अंकों का उत्तर नहीं दिया हो। (वास्तव में, आपको सुनिश्चित होने के लिए 96 * 2 + 1 = 193 अंकों की आवश्यकता होगी।)
बैरी ब्राउन

4
वास्तव में चक्र का पता लगाना कंप्यूटर के लिए बिल्कुल भी कठिन नहीं है। यदि आप हेहनर के पेपर को पढ़ते हैं, तो वह बताता है कि विभिन्न अंकगणितीय कार्यों के लिए चक्रों का पता कैसे लगाया जाए। उदाहरण के लिए, डिवीजन एल्गोरिथ्म में, जो बार-बार घटाव का उपयोग करता है, आप जानते हैं कि चक्र कहाँ शुरू होता है जब आपको एक अंतर दिखाई देता है जिसे आपने पहले देखा है।
14

3
इसके अलावा, सवाल वास्तव में संख्याओं का प्रतिनिधित्व करने के बारे में था। कभी-कभी सटीक प्रतिनिधित्व का मतलब बहुत सारे बिट्स होते हैं। उद्धरण संकेतन की सुंदरता यह है कि हेन्नर यह दर्शाता है कि मानक 32-बिट फिक्स्ड-लंबाई प्रतिनिधित्व की तुलना में औसतन 31% बचत होती है।
नगसेंडेंड

6

बीसीडी - द्विआधारी-कोडित दशमलव - प्रतिनिधित्व सटीक हैं। वे बहुत स्थान-कुशल नहीं हैं, लेकिन इस मामले में सटीकता के लिए आपको एक व्यापार बंद करना होगा।


1
BCD किसी भी अन्य आधार की तुलना में अधिक या कम सटीक नहीं है। उदाहरण: आप बीसीडी में 1/3 का प्रतिनिधित्व कैसे करते हैं? आप नहीं कर सकते।
जोर्ग डब्ल्यू मित्तग

12
BCD एक DECIMAL का सटीक निरूपण है, इस प्रकार, um, "दशमलव" इसके नाम का हिस्सा है। 1/3 का कोई सटीक दशमलव प्रतिनिधित्व भी नहीं है।
एलन

4

यही कारण है कि आप आधार 10 में 1/3 का प्रतिनिधित्व नहीं कर सकते, आपको 0.33333 (3) कहने की आवश्यकता है। बाइनरी में यह एक ही प्रकार की समस्या है लेकिन बस विभिन्न संख्याओं के लिए होती है।


4

(नोट: मैं यहां द्विआधारी संख्या इंगित करने के लिए 'बी' जोड़ूंगा। अन्य सभी संख्याएं दशमलव में दी गई हैं)

चीजों के बारे में सोचने का एक तरीका वैज्ञानिक संकेतन जैसी चीज के संदर्भ में है। हम वैज्ञानिक संकेतन में व्यक्त संख्याओं को देखने के आदी हैं, जैसे 6.022141 * 10 ^ 23। फ्लोटिंग पॉइंट नंबरों को आंतरिक रूप से एक समान प्रारूप - मंटिसा और एक्सपोनेंट का उपयोग करके संग्रहीत किया जाता है, लेकिन दस के बजाय दो की शक्तियों का उपयोग करना।

आपकी 61.0 को 1.90625 * 2 ^ 5, या 1.11101b * 2 ^ 101b के रूप में मंटिसा और एक्सपोर्टर के साथ फिर से लिखा जा सकता है। इसे दस से गुणा करने और (दशमलव बिंदु को स्थानांतरित करने के लिए), हम कर सकते हैं:

(1.90625 * 2 ^ 5) * (1.25 * 2 ^ 3) = (2.3828125 * 2 ^ 8) = (1.19140625 * 2 ^ 9)

या बाइनरी में मंटिसा और एक्सपोर्टर के साथ:

(1.11101b * 2 ^ 101b) * (1.01b * 2 ^ 11b) = (10.0110001b * 2 ^ 1000b) = (1.00110001b * 2 ^ 1001b)

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

अब, विचार करें कि हम 61 को 10. से कैसे विभाजित करेंगे। हम मन्तिस, 1.90625 और 1.25 को विभाजित करके शुरू करेंगे। दशमलव में, यह 1.525 देता है, एक अच्छी संख्या है। लेकिन यह क्या है अगर हम इसे बाइनरी में बदलते हैं? हम इसे सामान्य तरीके से करेंगे - जब भी संभव हो, दो की सबसे बड़ी शक्ति को घटाकर, पूर्णांक दशमलव को बाइनरी में परिवर्तित करने की तरह, लेकिन हम दो की नकारात्मक शक्तियों का उपयोग करेंगे:

1.525 - 1 * 2 ^ 0 -> 1
0.525 - 1 * 2 ^ -1 -> 1
0.025 - 0 * 2 ^ -2 -> 0
0.025 - 0 * 2 ^ -3 -> 0
0.025 - 0 * 2 ^ -4 -> 0
0.025 - 0 * 2 ^ -5 -> 0
0.025 - 1 * 2 ^ -6 -> 1
0.009375 - 1 * 2 ^ -7 -> 1
0.0015625 - 0 * 2 ^ -8 -> 0
0.0015625 - 0 * 2 ^ -9 -> 0
0.0015625 - 1 * 2 ^ -10 -> 1
0.0005859375 - 1 * 2 ^ -11 -> 1
.००००९७६५६२५ ...

उह ओह। अब हम मुश्किल में हैं। यह पता चला है कि 1.90625 / 1.25 = 1.525, द्विआधारी में व्यक्त किए जाने पर एक दोहराव वाला अंश है: 1.11101b / 1.01b = 1.10000110011 ... b हमारी मशीनों में केवल इतने सारे बिट्स हैं जो उस मंटिसा को पकड़ सकते हैं और इसलिए वे बस अंश को गोल करेंगे और एक निश्चित बिंदु से परे शून्य मान लेते हैं। जब आप 61 को 10 से विभाजित करते हैं तो जो त्रुटि दिखाई देती है, वह अंतर है:

1.1000011001100110011001100110011001100110011 ... b * 2 ^ 10b
और, कहो:
1.100001100110011001100110b * 2 ^ 10b

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

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


4

यह अच्छा प्रश्न है।

आपका सारा प्रश्न "हम किसी संख्या का प्रतिनिधित्व कैसे करते हैं" पर आधारित है?

सभी संख्याओं को दशमलव प्रतिनिधित्व के साथ या बाइनरी (2 के पूरक) प्रतिनिधित्व के साथ दर्शाया जा सकता है। उन सभी को !!

लेकिन कुछ (उनमें से अधिकांश) को द्विआधारी स्थिति के लिए तत्वों की अनंत संख्या ("0" या "1" या दशमलव प्रतिनिधित्व के लिए "0", "1" से "9") की आवश्यकता होती है।

दशमलव प्रतिनिधित्व में 1/3 की तरह (1/3 = 0.3333333 ... <- "3" की अनंत संख्या के साथ)

बाइनरी में 0.1 की तरह (0.1 = 0.00011001100110011 .... <- "0011" की अनंत संख्या के साथ)

सब कुछ उस अवधारणा में है। चूँकि आपका कंप्यूटर केवल अंकों (दशमलव या बाइनरी) के सीमित सेट पर विचार कर सकता है, केवल कुछ संख्याओं को आपके कंप्यूटर में ठीक से दर्शाया जा सकता है ...

और जैसा कि जॉन ने कहा, 3 एक अभाज्य संख्या है जो कि 10 का कारक नहीं है, इसलिए आधार 10 में तत्वों की परिमित संख्या के साथ 1/3 का प्रतिनिधित्व नहीं किया जा सकता है ।

यहां तक ​​कि मनमानी परिशुद्धता के साथ अंकगणित के साथ, आधार 2 में नंबरिंग स्थिति प्रणाली पूरी तरह से 6.1 का वर्णन करने में सक्षम नहीं है, हालांकि यह 61 का प्रतिनिधित्व कर सकता है।

6.1 के लिए, हमें दूसरे प्रतिनिधित्व का उपयोग करना चाहिए (जैसे दशमलव प्रतिनिधित्व, या IEEE 854 जो फ़्लोट-पॉइंट मानों के प्रतिनिधित्व के लिए बेस 2 या बेस 10 की अनुमति देता है)


आप अंश के रूप में 1/3 का प्रतिनिधित्व कर सकते हैं। आपको इसे दर्शाने के लिए अनंत मात्रा में बिट्स की आवश्यकता नहीं है। आप इसे 1 के भाग के परिणाम के बजाय 1/3 के भाग के रूप में दर्शाते हैं। 3. कई सिस्टम इस तरह से काम करते हैं। तब आपको मानक / * + और समान ऑपरेटर का उपयोग करने के लिए एक तरीके की आवश्यकता होती है, ताकि वे भिन्नों के प्रतिनिधित्व पर काम कर सकें, लेकिन यह बहुत आसान है - आप एक पेन और पेपर के साथ उन कार्यों को कर सकते हैं, ऐसा करने के लिए कंप्यूटर को सिखाना कोई बड़ी बात नहीं है। ।
ओपन स्कूल

मैं "बाइनरी (2 के पूरक) प्रतिनिधित्व" के बारे में बात कर रहा था। क्योंकि, निश्चित रूप से, एक अन्य प्रतिनिधित्व का उपयोग करने से आपको तत्वों की परिमित संख्या के साथ कुछ संख्या का प्रतिनिधित्व करने में मदद मिल सकती है (और आपको कुछ अन्य के लिए तत्वों की अनंत संख्या की आवश्यकता होगी)
थिबथिब

3

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


3

मुझे आश्चर्य है कि किसी ने भी अभी तक यह नहीं कहा है: निरंतर अंशों का उपयोग करें । किसी भी तर्कसंगत संख्या को द्विआधारी रूप से इस तरह से प्रतिनिधित्व किया जा सकता है।

कुछ उदाहरण:

1/3 (0.3333 ...)

0; 3

5/9 (0.5555 ...)

0; 1, 1, 4

10/43 (0.232558139534883720930 ...)

0; 4, 3, 3

9093/18478 (0.49209871198181621387596060179673 ...)

0; 2, 31, 7, 8, 5

यहां से, मेमोरी में पूर्णांकों के अनुक्रम को संग्रहीत करने के विभिन्न प्रकार हैं।

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

पाई का निरंतर अंश:

3; 7, 15, 1, 292 ...

1 पर अनुक्रम समाप्त, यह अंश देता है:

355/113

जो एक उत्कृष्ट परिमेय सन्निकटन है।


लेकिन आप बाइनरी में इसका प्रतिनिधित्व कैसे करेंगे? उदाहरण के लिए 15 के लिए 4 बिट्स का प्रतिनिधित्व करने की आवश्यकता होती है, लेकिन 292 के लिए 9. आवश्यकता होती है। हार्डवेयर (या सॉफ्टवेयर) कैसे जानता है कि प्रत्येक के बीच बिट सीमाएं कहां हैं? यह दक्षता बनाम सटीकता व्यापार है।
धनु राशि

2

समीकरण में

2^x = y ;  
x = log(y) / log(2)

इसलिए, मैं सोच रहा था कि क्या हमारे पास बाइनरी के लिए लॉगरिदमिक बेस सिस्टम हो सकता है,

 2^1, 2^0, 2^(log(1/2) / log(2)), 2^(log(1/4) / log(2)), 2^(log(1/8) / log(2)),2^(log(1/16) / log(2)) ........

यह समस्या को हल करने में सक्षम हो सकता है, इसलिए यदि आप बाइनरी में 32.41 जैसा कुछ लिखना चाहते हैं, तो यह होगा

2^5 + 2^(log(0.4) / log(2)) + 2^(log(0.01) / log(2))

या

2^5 + 2^(log(0.41) / log(2))

1

समस्या यह है कि आप वास्तव में नहीं जानते कि क्या वास्तव में संख्या 61.0 है। इस पर विचार करो:


float a = 60;
float b = 0.1;
float c = a + b * 10;

C का मान क्या है? यह बिलकुल 61 नहीं है, क्योंकि b वास्तव में .1 नहीं है क्योंकि .1 में सटीक बाइनरी प्रतिनिधित्व नहीं है।


1

एक सीमा है क्योंकि अंक का अर्थ पूर्णांक से गैर-पूर्णांक तक चला गया है। 61 का प्रतिनिधित्व करने के लिए, आपके पास 6 * 10 ^ 1 + 1 * 10 ^ 0 है; 10 ^ 1 और 10 ^ 0 दोनों पूर्णांक हैं। 6.1 6 * 10 ^ 0 + 1 * 10 ^ -1 है, लेकिन 10 ^ -1 1/10 है, जो निश्चित रूप से पूर्णांक नहीं है। इस तरह से आप Inexactville में अंत करते हैं।


1

एक समानांतर अंशों और पूरी संख्याओं से बना जा सकता है। कुछ अंशों जैसे 1/7 को दशमलव रूप में बहुत सारे और बहुत सारे दशमलव के बिना प्रतिनिधित्व नहीं किया जा सकता है। क्योंकि फ़्लोटिंग पॉइंट बाइनरी है जो विशेष मामलों में बदलाव के आधार पर होता है लेकिन एक ही तरह की सटीकता की समस्याएं खुद को प्रस्तुत करती हैं।


0

इसमें अनंत संख्या में परिमेय संख्याएँ और बिट्स की सीमित संख्या होती है, जिनके साथ उनका प्रतिनिधित्व किया जाता है। Http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems देखें ।


लेकिन एक अनंत संख्या में बिट्स के साथ, यदि आपने एक फ्लोटिंग बाइनरी पॉइंट का उपयोग किया है , तो आप अभी भी 0.1 का प्रतिनिधित्व नहीं कर पाएंगे, ठीक उसी तरह जैसे आप बिट्स की अनंत संख्या के साथ दशमलव में भी 1/3 का प्रतिनिधित्व नहीं कर सकते।
जॉन स्कीट

3
@Jon यह असत्य है: अनंत संख्या में दशमलव के साथ, मैं उदाहरण के लिए 'एक तिहाई' बिल्कुल व्यक्त कर सकता हूं । वास्तविक दुनिया की समस्या यह है कि दशमलव या बिट्स की "अनंत संख्या" होना शारीरिक रूप से संभव नहीं है
क्रिस जुएल

0

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

दशमलव बिंदु के दाईं ओर सन्निकटन के बिंदु तक पहुंचना बहुत आसान है। यदि आपने बाइनरी फ़्लोटिंग पॉइंट में सभी संख्याओं को लिखना शुरू कर दिया है, तो यह अधिक समझ में आएगा।

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


0

क्या आप पूर्णांक संख्याओं को जानते हैं? प्रत्येक बिट 2 ^ n का प्रतिनिधित्व करता है


2 ^ 4 = 16
2 ^ 3 = 8
2 ^ 2 = 4
2 ^ 1 = 2
2 ^ 0 = 1

अच्छी तरह से फ्लोटिंग पॉइंट (कुछ अंतर के साथ) के लिए समान है लेकिन बिट्स 2 ^ -n 2 ^ -1 = 1/2 = 0.5
2 ^ -2 = 1 / (2 * 2) = 0.25
2 ^ -3 = 0.125 का प्रतिनिधित्व करते हैं
2 ^ -4 = 0,0625

फ़्लोटिंग पॉइंट बाइनरी प्रतिनिधित्व:

हस्ताक्षर घातांक (मुझे लगता है कि अदृश्य 1 अंश में संलग्न है)
B11 B10 B9 B8 B7 B6 B5 B4 B3 B2 B1 B0


0

ऊपर दिए गए उच्च स्कोरिंग उत्तर ने इसे रोक दिया।

पहले आप अपने प्रश्न में आधार 2 और आधार 10 का मिश्रण कर रहे थे, फिर जब आप दाईं ओर एक संख्या डालते हैं जो आधार में विभाज्य नहीं है तो आपको समस्याएँ मिलती हैं। जैसे दशमलव में 1/3 क्योंकि 3 बाइनरी 10 या 1/5 बाइनरी की शक्ति में नहीं जाता है जो कि 2 की शक्ति में नहीं जाता है।

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


0

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

फ़्लोटिंग पॉइंट और पूर्णांक अभ्यावेदन प्रतिनिधित्व संख्याओं के लिए ग्रिड या जाली प्रदान करते हैं। जैसे ही अंकगणित किया जाता है, परिणाम ग्रिड से गिर जाते हैं और उन्हें गोलाई में वापस ग्रिड पर रखना पड़ता है। उदाहरण बाइनरी ग्रिड पर 1/10 है।

यदि हम बाइनरी कोडेड दशमलव प्रतिनिधित्व का उपयोग करते हैं, जैसा कि एक सज्जन ने सुझाव दिया है, तो क्या हम ग्रिड पर नंबर रख पाएंगे?


1
दशमलव संख्या, निश्चित। लेकिन यह सिर्फ परिभाषा से है। आप दशमलव में 1/3 का प्रतिनिधित्व नहीं कर सकते, बाइनरी में आप 0.1 का प्रतिनिधित्व कर सकते हैं। कोई भी परिमाणीकरण योजना एक बड़ी संख्या के असीम रूप से विफल हो जाती है।
काइलोटन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.