2011-06-08 9 views
5

मुझे कुछ परेशानी हो रही है क्यों कुछ आंकड़े फ़्लोटिंग पॉइंट नंबर के साथ प्रदर्शित नहीं किए जा सकते हैं।फ़्लोटिंग पॉइंट प्रतिनिधित्व त्रुटियों को समझना; मेरी सोच में क्या गलत है?

जैसा कि हम जानते हैं, एक सामान्य फ्लोट में साइन बिट, एक्सपोनेंट और मंटिसा होगा। उदाहरण के लिए, 0.1 इस प्रणाली में सटीक रूप से क्यों प्रतिनिधित्व नहीं कर सकते हैं; जिस तरह से मैं सोचता हूं कि आप 10 (1010 बिन) मंटिसा और -2 एक्सपोनेंट में डाल देंगे। जहां तक ​​मुझे पता है, मंटिसा और एक्सपोनेंट में दोनों संख्याओं का सटीक रूप से प्रतिनिधित्व किया जा सकता है। तो हम 0.1 सटीक रूप से क्यों प्रतिनिधित्व नहीं कर सकते?

उत्तर

8

यदि आपका एक्सपोनेंट दशमलव है (यानी यह 10^एक्स का प्रतिनिधित्व करता है), तो आप 0.1 का प्रतिनिधित्व कर सकते हैं - हालांकि, अधिकांश फ़्लोटिंग पॉइंट प्रारूप बाइनरी एक्सपोनेंट्स का उपयोग करते हैं (यानी वे 2^एक्स का प्रतिनिधित्व करते हैं)। चूंकि कोई पूर्णांक X और Y ऐसे Y * (2^X) = 0.1 नहीं हैं, इसलिए आप अधिकतर फ़्लोटिंग पॉइंट प्रारूपों में 0.1 का सटीक रूप से प्रतिनिधित्व नहीं कर सकते हैं।

कुछ भाषाओं में दोनों एक्सपोनेंट्स के साथ प्रकार होते हैं। सी # में, उदाहरण के लिए, एक डेटा प्रकार उपयुक्त नाम decimal है जो एक दशमलव एक्सपोनेंट के साथ एक फ़्लोटिंग पॉइंट प्रारूप है, इसलिए यह 0.1 जैसी संख्या को संग्रहीत करने में सहायता करेगा, हालांकि इसमें अन्य असामान्य गुण हैं: decimal प्रकार 0.1 और 0.10 के बीच अंतर कर सकता है , और x के सभी मानों के लिए यह हमेशा सत्य है कि x + 1 != x

सबसे आम प्रयोजनों के लिए, हालांकि, सी # भी float और double चल बिन्दु प्रकार है कि ठीक 0.1 संग्रहीत नहीं कर सकता, क्योंकि वे एक द्विआधारी प्रतिपादक (के रूप में आईईईई-754 में परिभाषित) का उपयोग किया है। द्विआधारी फ्लोटिंग पॉइंट प्रकार कम भंडारण का उपयोग करते हैं, तेज़ी से होते हैं क्योंकि उन्हें कार्यान्वित करना आसान होता है, और उनके ऊपर अधिक परिचालन परिभाषित होते हैं। सामान्य रूप से decimal केवल वित्तीय मानों के लिए उपयोग किया जाता है जहां सभी दशमलव मानों का सटीक प्रतिनिधित्व महत्वपूर्ण है और संचालन, गति और संचालन की सीमा नहीं है।

+1

धन्यवाद, सी # उदाहरण दिलचस्प है – tsiki

1

यह 10 × 2 -1 = 5, 0.1 नहीं होगा।

आम तौर पर, यह आधार दस में एक तिहाई का प्रतिनिधित्व करने जैसा है: अंकों की सीमित संख्या के साथ यह संभव नहीं है।

वैसे, 10 = 1010 ≠ 1100 ।

0

आप 1 * 10^-1 के बारे में सोच रहे हैं, जो decimal floating number प्रतिनिधित्व के लिए काम करता है, जैसे सी # में दशमलव। सामान्य फ्लोटिंग पॉइंट (जैसे फ्लोट, डबल) द्विआधारी प्रतिनिधित्व का उपयोग करता है, यानी 2

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

2

आईईईई 754 मानक में प्रत्येक फ्लोटिंग प्वाइंट संख्या है, प्रभाव में, कुछ पूर्णांक दो की कुछ पूर्णांक शक्ति से गुणा। जैसे, 3 का प्रतिनिधित्व 3 * 2 , 96 3 * 2 द्वारा दर्शाया गया है, और 3/16 का प्रतिनिधित्व 3 * 2 -4 द्वारा किया जाता है।

कोई पूर्णांक x और y ऐसी है कि .1 = एक्स * 2 y, इसलिए .1 वास्तव में एक फ्लोटिंग प्वाइंट संख्या से प्रदर्शित नहीं किया जा सकता है। सबूत: यदि .1 = x * 2 y, तो 10x = 2 -y। 2 -y स्पष्ट रूप से सकारात्मक है, इसलिए एक्स सकारात्मक है। यह भी एक पूर्णांक है, इसलिए 10x 10 से विभाजित है, इसलिए यह 5 से विभाजित है। इसलिए 2 -y दो की शक्ति है जो 5 तक विभाजित है, जो स्पष्ट रूप से असंभव है।

संबंधित मुद्दे