क्या ऐसी संख्याएं हैं जो आधार 10 में प्रतिनिधित्व करने योग्य नहीं हैं लेकिन आधार 2 में प्रतिनिधित्व किया जा सकता है?


42

C#है decimalप्रकार जो संख्या है कि आधार से 10 में सही प्रतिनिधित्व की जरूरत है उदाहरण के लिए के लिए प्रयोग किया जाता है, 0.1आधार 2 में प्रतिनिधित्व नहीं किया जा सकता है (जैसे floatऔर double) और हमेशा जब चर है कि इन प्रकार के होते हैं में संग्रहीत एक सन्निकटन हो जाएगा।

मैं सोच रहा था कि क्या उलटा तथ्य भी संभव था। क्या ऐसे नंबर हैं जो आधार 10 में प्रतिनिधित्व करने योग्य नहीं हैं, लेकिन आधार 2 में प्रतिनिधित्व किया जा सकता है (जिस स्थिति में मैं उन्हें संभालने के floatबजाय उपयोग करना चाहूंगा decimal)?


14
प्रश्न के लिए +1, लेकिन क्या वास्तव में c # टैग यहां लागू है? अन्य भाषाओं में दशमलव प्रकार भी होता है।
पैट्रिक एम

1
@ मोम: एक अभ्यास के रूप में, मैं आपको सुझाव देता हूं कि आप एक आधार संख्या 2 को आधार 10 में परिवर्तित करके कल्पना करें। जैसे, के मूल्य की गणना करने के लिए 0.11_b2इसे लिखें 0.5 + 0.5 * 0.5। क्या कोई ऐसा कदम है जो दोहराए जाने वाले दशमलव में विफल या परिणाम हो सकता है? व्यक्तिगत रूप से, मुझे पता है कि यह अभ्यास बेस 2 नंबरों के बारे में एक अंतर्ज्ञान में एक महान काम करता है। मुझे लगता है कि एक कदम आगे जा सकता है और निर्माण द्वारा इस अभ्यास को एक प्रमाण में बदल सकता है।
ब्रायन

आह, लेकिन तुम गलत हो। 1/1010
जेवियर जे

3
@ रामध्वनि स्मृति सीमाओं को देखते हुए, बाइनरी 0.0999999....998..वास्तव में प्रतिनिधित्व कर सकती है, लेकिन पूरी संख्या नहीं 0.1- निकटतम हंड्रेथ के साथ चक्कर लगाने की तरह 0.100एक कार्यान्वयन चिंता का विषय है जिसमें आपको सभी अंकों को नहीं दिखाना और इसके बजाय इसे गोल करना शामिल है।
इजाकाता

1
खैर, एक एफपी एन्कोडिंग तंत्र के साथ आना संभव है जो '0.1' को बिल्कुल प्रतिनिधित्व करने की अनुमति देता है। इस तरह की एन्कोडिंग केवल एफपी नंबर पर्वतमाला के सेटों के इर्द-गिर्द ही घूमती है और इसका प्रतिनिधित्व नहीं किया जा सकता है।
मार्टिन जेम्स

जवाबों:


104

यहाँ आपके प्रश्न की कुंजी है: 10का उत्पाद है 2और 5। आप वास्तव में आधार में 10 दशमलव कश्मीर है कि * 1/2 किसी भी संख्या का प्रतिनिधित्व कर सकते n * 1/5 मीटर जहां k, nऔर mपूर्णांक हैं।

वैकल्पिक रूप से सुव्यवस्थित - यदि संख्या nमें 1 / n में एक कारक होता है जो आधार के कारकों का हिस्सा नहीं होता है, तो संख्या बाइनरी / दशमलव / अंकों के निश्चित संख्या में बिल्कुल निश्चित संख्या में प्रतिनिधित्व नहीं कर पाएगी और जो भी इसका विस्तार होगा संख्या - इसका दोहराव हिस्सा होगा। उदाहरण के लिए 1/15 = 0.0666666666 .... क्योंकि 3 (15 = 3 * 5) 10 का कारक नहीं है।

इस प्रकार, कुछ भी जो आधार 2 में प्रतिनिधित्व करने में सक्षम है (k * 1/2 n ) आधार 10 में बिल्कुल प्रतिनिधित्व किया जा सकता है।

इसके अलावा, संख्या का प्रतिनिधित्व करने के लिए आप कितने अंकों / बिट्स का उपयोग कर रहे हैं, इसका मुद्दा है। कुछ संख्याएँ हैं जो कुछ आधार में बिल्कुल प्रतिनिधित्व करने में सक्षम हैं, लेकिन यह करने के लिए अंकों / बिट्स की संख्या से अधिक है।


बाइनरी में, संख्या 1/10 जो दशमलव में सुविधाजनक रूप से 0.1 है, को एक संख्या के रूप में प्रतिनिधित्व नहीं किया जा सकता है जिसे बाइनरी में निश्चित संख्या में बिट्स में दर्शाया जा सकता है। इसके बजाय, संख्या 0.00011001100110011 है ... 2 (0011 भाग के साथ हमेशा के लिए दोहराते हुए)।

नंबर 1 पर नज़र चलें 2 /1010 2 थोड़ा और अधिक बारीकी से।

          ____                  
       .००,०११                  
     + ---------                 
1010 | १.००,०००                  
       0                        
       -                       
       १ ०                      
         0                      
       ----                     
       १ ०० --------- +          
          0 |          
       ----- |          
       1 000 |          
           0 |          
       ------ | दोहरा
       1 0000 | खंड    
         1010 |          
       ------ |          
          1100 |          
          1010 |          
          ---- |          
            100 ---- +          

यह ठीक उसी प्रकार की चीज है जो आपको तब मिलती है जब आप 1/3 के लिए लंबा विभाजन करने की कोशिश करते हैं।

1/10, जब फैक्टर 1/2 (2 1 * 5 1 ) होता है। आधार 10 (या 10 के किसी भी एकाधिक) के लिए, यह संख्या समाप्त हो जाती है और इसे नियमित संख्या के रूप में जाना जाता है । एक दशमलव विस्तार जो दोहराता है एक दोहराए जाने वाले दशमलव के रूप में जाना जाता है , और जो संख्याएं दोहराए बिना हमेशा के लिए चली जाती हैं वे तर्कहीन संख्याएं हैं।

इस के पीछे का गणित में विशद जानकारी देता फर्मा थोड़ा प्रमेय ... और एक बार आप कह फर्मेट या प्रमेय, यह एक हो जाता है शुरू Math.SE सवाल

क्या ऐसी संख्याएं हैं जो आधार 10 में प्रतिनिधित्व करने योग्य नहीं हैं लेकिन आधार 2 में प्रतिनिधित्व किया जा सकता है?

जवाब न है'।

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


आइए हम C # में दशमलव पर अधिक बारीकी से देखें जो हमें .NET में दशमलव के अस्थायी बिंदु की ओर ले जाता है और लेखक को दिया, मैं मानता हूं कि यह कैसे काम करता है।

दशमलव प्रकार में किसी भी अन्य फ़्लोटिंग पॉइंट संख्या के समान घटक होते हैं: एक मंटिसा, एक घातांक और एक संकेत। हमेशा की तरह, संकेत सिर्फ एक बिट है, लेकिन मंटिसा के 96 बिट्स और एक्सपेंटर के 5 बिट्स हैं। हालांकि, सभी घातांक संयोजन मान्य नहीं हैं। केवल मान 0-28 काम करते हैं, और वे प्रभावी रूप से सभी नकारात्मक हैं: संख्यात्मक मान है । इसका अर्थ है कि प्रकार के अधिकतम और न्यूनतम मान +/- (2 96 -1) हैं, और पूर्ण परिमाण के संदर्भ में सबसे छोटी गैर शून्य संख्या 10 -28 हैsign * mantissa / 10exponent

मैं अभी इस ओर ध्यान दिलाता हूं कि इस कार्यान्वयन के कारण उस doubleप्रकार के नंबर हैं, जिनका प्रतिनिधित्व नहीं किया जा सकता है decimal- जो कि सीमा से बाहर हैं। Double.Epsilonवह है 4.94065645841247e-324जो एक में प्रतिनिधित्व नहीं किया जा सकता है decimal, लेकिन एक में कर सकते हैं double

हालांकि, उस सीमा के भीतर जो दशमलव का प्रतिनिधित्व कर सकता है, इसमें अन्य देशी प्रकारों की तुलना में सटीकता के अधिक बिट्स हैं और त्रुटि के बिना उनका प्रतिनिधित्व कर सकते हैं।

वहाँ कुछ अन्य प्रकार के आसपास तैर रहे हैं। C # में एक BigInteger है जो एक मनमाने ढंग से बड़े पूर्णांक का प्रतिनिधित्व कर सकता है। वहाँ जावा के लिए कोई बराबर है BigDecimal (जो संख्या 2 तक के दशमलव अंकों के साथ प्रतिनिधित्व कर सकते हैं 32 - जो एक बड़े आकार का रेंज अंक लंबा) वास्तव में । हालांकि, अगर आप थोड़ा सा इधर-उधर ताकते हैं , तो आप हाथ से चलने वाले कार्यान्वयन पा सकते हैं।

कुछ भाषाएँ हैं जिनमें एक तर्कसंगत डेटा प्रकार भी है जो आपको तर्कसंगत रूप से प्रतिनिधित्व करने की अनुमति देता है (ताकि 1/3 वास्तव में 1/3 हो)।


Specifcally सी # और नाव या तर्कसंगत के चुनाव के लिए, मैं से जॉन स्कीट के लिए स्थगित कर देंगे .NET में दशमलव चल पिंट :

अधिकांश व्यावसायिक अनुप्रयोगों को शायद फ्लोट या डबल के बजाय दशमलव का उपयोग करना चाहिए। मेरे अंगूठे का नियम यह है कि मुद्रा के रूप में मानव निर्मित मूल्य आमतौर पर दशमलव फ़्लोटिंग बिंदु के साथ बेहतर प्रतिनिधित्व करते हैं: उदाहरण के लिए, ठीक 1.25 डॉलर की अवधारणा पूरी तरह से उचित है। प्राकृतिक दुनिया के मूल्यों के लिए, जैसे कि लंबाई और वजन, बाइनरी फ्लोटिंग पॉइंट प्रकार अधिक समझ में आते हैं। हालांकि एक सैद्धांतिक "ठीक 1.25 मीटर" है जो वास्तव में कभी नहीं होने वाला है: आप निश्चित रूप से कभी भी सटीक लंबाई मापने में सक्षम नहीं होंगे, और वे परमाणु स्तर पर भी मौजूद होने की संभावना नहीं है। हम वहाँ एक निश्चित सहिष्णुता होने के लिए उपयोग किया जाता है।


एक स्पष्ट और संक्षिप्त गणितीय स्पष्टीकरण के लिए +1। और शीर्षक में सामने आए प्रश्न के अधिक सामान्य संस्करण का उत्तर देने के लिए, आधार 10 में प्रतिनिधित्व योग्य संख्या का उदाहरण 1/3 है।
डोभाल

@ डोवल मुझे संदेह है कि मेरे तर्क या स्पष्टीकरण में गड़बड़ है कि एक अधिक गणित उन्मुख व्यक्ति इंगित कर सकता है ... लेकिन मुझे लगता है कि अगर यह मामला है तो मैं सही रास्ते पर हूं।

इस मामले में "सापेक्ष रूप से प्रधान" का अर्थ है "सही का कारक" नहीं? क्या कुछ गहरे गणितीय संबंध हैं जो मुझे याद आ रहे हैं?
पैट्रिक एम

1
आह, इसलिए जैसा कि मैं इसे समझता हूं, n = 15और अपेक्षाकृत प्रमुखb = 10 नहीं हैं ("1 को छोड़कर कोई भी सामान्य सकारात्मक कारक (भाजक) साझा नहीं करते हैं) क्योंकि वे 5 को एक कारक के रूप में साझा करते हैं। कुंजी यह है कि 15 (5 और 3) के सभी कारक 10. के कारक भी नहीं हैं (असाइड: क्या संख्याओं को इंगित करने के लिए एक शब्द है जो सभी सामान्य कारकों को साझा नहीं करते हैं?) मुझे लगता है कि यह बड़े करीने से है? अपने समीकरण में लिपटे , लेकिन वास्तव में मेरे सिर को उसके चारों ओर लपेटने के लिए, मुझे एक 3 डी प्लॉट देखने की आवश्यकता होगी। भले ही, आप के लिए अच्छी तरह से लायक है। k, n, m
पैट्रिक एम

1
@PatrickM: "असाइड: एक संख्या है जो संख्याओं को इंगित करती है या सभी सामान्य कारकों को साझा नहीं करती है?": कोई भी पूर्णांक स्वयं का एक कारक है, इसलिए यदि मी के सभी कारक n के कारक हैं , तो यह तुच्छ रूप से अनुसरण करता है। m n का कारक है । इसके लिए एक शब्द, जैसा कि आप स्पष्ट रूप से जानते हैं, कारक है । एक और भाजक है
बरखा

6

एक बार जब आप स्वीकार्य मानों की सीमा से बाहर हो जाते हैं, तो इसका उत्तर हां में है। उस ने कहा, सीमा के अंदर लगभग कुछ भी एक प्रतिनिधित्व होगा। C # दशमलव संदर्भ , विनिर्देश में नहीं बताया गया है, अतार्किक संख्याओं का सही प्रतिनिधित्व नहीं किया जा सकता है (जैसे, e 1 , pi, 2 का वर्गमूल, आदि)।

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

परिशुद्धता: 28-29 महत्वपूर्ण अंक

1 माइकल का धन्यवाद मुझे एक और तर्कहीन संख्या की याद दिलाने के लिए।


2
@ मैगस अपरिमेय संख्या e(2.71 ...) पर विचार करें । प्राकृतिक लॉग - ln (x) लॉग बेस ई है। इस प्रकार, तर्कहीन आधार मौजूद हैं और उपयोगी हैं। आधार पी की विशेष उपयोगिता, मुझे यकीन नहीं है - लेकिन इसका मतलब यह नहीं है कि इसका कहीं उपयोग नहीं किया जाता है।

6
@ मैक्स आप गणित के सवालों में ज्यादा से ज्यादा भटक रहे हैं। आपको लग सकता है कि यदि कोई संख्या आधार 10 में तर्कहीन है, तो क्या यह अन्य आधारों में तर्कहीन है? अधिक संख्या सिद्धांत प्रश्नों के लिए एक उपयोगी रीड और शुरुआती बिंदु होना।

2
1/3 तर्कहीन नहीं है।
एडम ज़ुकरमैन

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

5
@FrustratedWithFormsDesigner अपरिमेयता का आधारों से कोई लेना देना नहीं है। खैर, यह एक अतिरंजना है, लेकिन यह तर्कहीनता है जिसका विभिन्न आधारों में संख्या के प्रतिनिधित्व के लिए निहितार्थ है (जैसे कि इसमें अनंत गैर-दोहराव अंक हैं), न कि दूसरे तरीके से। ऊपर दिए गए math.se प्रश्न पढ़ें: math.stackexchange.com/questions/625473/…

1

एक बेस-टू फ़्लोटिंग-पॉइंट प्रकार कई मानों को ठीक से प्रदर्शित करने में सक्षम होगा जो एक ही आकार के बेस-दस प्रकार नहीं कर सकते थे। कोई भी मूल्य जो किसी आकार के बेस -2 प्रकार द्वारा बिल्कुल प्रतिनिधित्व योग्य होगा, आधार-दस प्रकार के पर्याप्त आकार में बिल्कुल प्रतिनिधित्व योग्य होगा। एक बाइनरी फ़्लोटिंग-पॉइंट संख्या के सभी मूल्यों का प्रतिनिधित्व करने के लिए विशुद्ध रूप से आधार-दस प्रकार के लिए आवश्यक आकार बाइनरी प्रकार की घातांक सीमा पर निर्भर करेगा; ए के लिए सैकड़ों बिट्स float, या ए के लिए हजारों double

यह कहा गया है कि, यह Decimalप्रकार काफी बड़ा है कि यह संभव है कि यह "सार्वभौमिक" प्रकार के रूप में उपयोग करने योग्य हो, जो किसी अन्य संख्यात्मक आदिम का मान रखने में सक्षम हो और इसके अलावा कुछ अन्य अतिरिक्त सुविधाएँ प्रदान करें (यदि और कुछ नहीं, तो एक बिट का उपयोग करें) यह इंगित करने के लिए कि क्या संग्रहीत मान एक रूपांतरित करने का परिणाम है double, और यदि वह बिट सेट है, तो प्रश्न में मान रखने के लिए 64 बिट्स का उपयोग करें)। Microsoft ने ऐसा नहीं करने का विकल्प चुना। नतीजतन, एक के रूपांतरण doubleके लिए Decimal, बड़े मूल्यों के लिए पूरी तरह से असफल हो जायेगी कारण होगा छोटे मान निकटतम 1E-28 पूर्ण होना। इसके अलावा, डायनेमिक रेंज के भीतर भीdecimalरूपांतरण पद्धति "राउंड-ट्रिप" नहीं होगी। उदाहरण के लिए, 1.0 / 3.0 का दोगुना के रूप में मूल्यांकन करने पर 0.3333333333333333148 का उत्पादन होगा, लेकिन दशमलव को 0.333333333333333m में परिवर्तित करने और वापस डबल में परिवर्तित करने से 0.3333333333333329818 निकलेगा।

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