2011-10-04 34 views
16

मैंने पढ़ा है कि वे मंटिसा के रूप में संग्रहीत हैं और एक्सपोनेंटस्मृति में फ़्लोटिंग पॉइंट नंबर कैसे संग्रहीत किए जाते हैं?

मैंने this document पढ़ा है लेकिन मुझे कुछ भी समझ नहीं आया।

+1

दस्तावेज़ को आप से जुड़ा हुआ नहीं बल्कि स्पष्ट रूप से यह बताते हैं का उपयोग करें। आपको विशेष रूप से समझने में क्या मुश्किल लगता है? –

+1

@ माइकलबोर्गवर्ड नहीं, यह स्पष्ट नहीं है। यह बताता है कि एक्सपोनेंट कैसे संग्रहीत किया जाता है समस्या को शुरू करने के बाद इस स्पष्टीकरण की आवश्यकता होती है ('लेकिन क्या होगा यदि संख्या शून्य है?' ... 'ओह प्रिय')। यह उन अपराध कहानियों की तरह है जहां चाल यह है कि उन्होंने आपको सभी सूचनाएं नहीं दिखायीं लेकिन कहानी में मुख्य पात्र उन्हें सभी जानता है। – xanatos

उत्तर

25

को समझने के लिए कि वे कैसे जमा हो जाती है, तो आपको पहले कि वे क्या कर रहे हैं और मूल्यों वे संभाल करने के लिए करना है कि किस तरह समझना चाहिए।

पूर्णांक के विपरीत, एक फ़्लोटिंग-पॉइंट मान का उद्देश्य बहुत कम मूल्यों के साथ-साथ बेहद बड़े पैमाने पर प्रदर्शित करना है। सामान्य 32-बिट फ़्लोटिंग-पॉइंट मानों के लिए, यह 1.175494351 * 10^-38 से 3.40282347 * 10^+ 38 से सीमा में मानों के अनुरूप है।

स्पष्ट रूप से, केवल 32 बिट्स का उपयोग करके, इस संख्या में प्रत्येक अंक को स्टोर करना संभव नहीं है।

जब प्रतिनिधित्व की बात आती है, तो आप सभी सामान्य फ़्लोटिंग-पॉइंट संख्याओं को 1.0 से (लगभग) 2.0 में मान के रूप में देख सकते हैं, जो दो की शक्ति के साथ स्केल किए गए हैं। तो 1.0 है, बस 1.0 * 2^0। 2।0 1.0 * 2^1 है। -5.0 -1.25 * 2^2 है।

तो, इसे यथासंभव कुशलता से एन्कोड करने के लिए आवश्यक है? हमें वास्तव में क्या चाहिए?

  • अभिव्यक्ति का संकेत।
  • एक्सपोनेंट
  • श्रेणी 1.0 से (लगभग) 2.0 में मान। इसे "मंथिसा" यानी महत्व के रूप में जाना जाता है।

यह आईईईई -754 फ्लोटिंग-पॉइंट मानक के अनुसार निम्नानुसार एन्कोड किया गया है।

  • साइन एक ही बिट है।
  • एक्सपोनेंट 32-बिट्स फ्लोटिंग-पॉइंट मानों के लिए एक हस्ताक्षरित पूर्णांक के रूप में संग्रहीत किया जाता है, यह फ़ील्ड 8 बिट्स है। 1 सबसे छोटा एक्सपोनेंट और "सभी - 1" सबसे बड़ा प्रतिनिधित्व करता है। (0 और "सभी वाले" का उपयोग विशेष मानों को एन्कोड करने के लिए किया जाता है, नीचे देखें।) मध्य में एक मान (127, 32-बिट मामले में) शून्य का प्रतिनिधित्व करता है, इसे पूर्वाग्रह के रूप में भी जाना जाता है।
  • मंटिसा (1.0 और (लगभग) 2.0 के बीच मान) को देखते समय, कोई देखता है कि सभी संभावित मान "1" (दशमलव और बाइनरी प्रतिनिधित्व दोनों में) से शुरू होते हैं। इसका मतलब यह है कि इसे संग्रहीत करने में कोई बात नहीं है। शेष बाइनरी अंकों को एक पूर्णांक क्षेत्र में संग्रहीत किया जाता है, 32-बिट मामले में यह फ़ील्ड 23 बिट्स है।

    • शून्य दोनों प्रतिपादक और शून्य के रूप अपूर्णांश साथ इनकोडिंग:

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

  • प्लस और माइनस अनंतता - एक "सभी" एक्सपोनेंट और शून्य मंटिसा क्षेत्र का उपयोग करके प्रतिनिधित्व किया जाता है।
  • कोई संख्या नहीं (NaN) - "सभी" एक्सपोनेंट और गैर-शून्य मंटिसा का उपयोग करके प्रतिनिधित्व किया जाता है।
  • denormalized संख्या - छोटी सामान्य संख्या से छोटी संख्या। शून्य एक्सपोनेंट फ़ील्ड और गैर-शून्य मंटिसा का उपयोग करके प्रतिनिधित्व किया गया। इन संख्याओं के साथ विशेष बात यह है कि परिशुद्धता (यानी अंकों की संख्या में शामिल होने वाले अंकों की संख्या) कम हो जाएगी, मान कम हो जाएगा, क्योंकि मंटिसा में उनके लिए जगह नहीं है।

    • 1,0: 3f800000
    • -1234,0: c49a4000
    • 100000000000000000000000,0: 65a96816

अंत में, निम्नलिखित (सभी मूल्यों हेक्स में हैं) ठोस उदाहरण के एक मुट्ठी भर है

6

आम आदमी के शब्दों में, यह अनिवार्य रूप से scientific notation बाइनरी में है। औपचारिक मानक (विवरण के साथ) IEEE 754 है।

+5

+1 लेकिन विकी औपचारिक मानक नहीं है, यह औपचारिक मानक की व्याख्या में सबसे अधिक है :-) :-) – xanatos

+4

और सी को आईईईई फ़्लोटिंग-पोइमेट की आवश्यकता नहीं है। –

3
typedef struct { 
     unsigned int mantissa_low:32;  
     unsigned int mantissa_high:20; 
     unsigned int exponent:11;   
     unsigned int sign:1; 
    } tDoubleStruct; 

double a = 1.2; 
tDoubleStruct* b = reinterpret_cast<tDoubleStruct*>(&a); 

एक उदाहरण कैसे स्मृति की स्थापना की है, तो संकलक आईईईई 754 डबल परिशुद्धता जो सबसे सिस्टम पर एक सी डबल आज के लिए डिफ़ॉल्ट है का उपयोग करता है।

यहां यह सी आधारित बाइनरी रूप में है और इसे समझने के लिए wikipedia about double precision बेहतर पढ़ें।

+1

यह एक संभावना है, लेकिन केवल एक ही नहीं। –

2

कई अलग-अलग फ़्लोटिंग-पॉइंट प्रारूप हैं। उनमें से अधिकतर कुछ सामान्य विशेषताओं को साझा करते हैं: एक साइन बिट, एक एक्सपोनेंट को स्टोर करने के लिए समर्पित कुछ बिट्स, और महत्व को संग्रहित करने के लिए समर्पित कुछ बिट्स (जिसे मंटिसा भी कहा जाता है)।

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

1

मंटिसा संख्या के सबसे महत्वपूर्ण बिट्स का प्रतिनिधित्व करता है।

एक्सपोनेंट प्रतिनिधित्व करता है कि संख्या के वास्तविक मूल्य को प्राप्त करने के लिए मंटिसा पर कितनी बदलाव की जानी है।

एन्कोडिंग निर्दिष्ट करता है कि मंटिसा का प्रतिनिधित्व कैसे किया जाता है और एक्सपोनेंट का संकेत (मूल रूप से बाएं या दाएं स्थानांतरित हो रहा है)।

आपके द्वारा संदर्भित दस्तावेज़ IEEE एन्कोडिंग निर्दिष्ट करता है, जो सबसे व्यापक रूप से उपयोग किया जाता है।

1

मुझे वह आलेख मिला है जिसे आपने काफी गैरकानूनी संदर्भित किया है (और मुझे पता है कि आईईईई कैसे काम करता है)। मेरा सुझाव है कि आप स्पष्टीकरण के विकी संस्करण के साथ प्रयास करें। यह काफी स्पष्ट है और विभिन्न उदाहरण है:

http://en.wikipedia.org/wiki/Single_precision और http://en.wikipedia.org/wiki/Double_precision

0

यह कार्यान्वयन परिभाषित किया गया है, हालांकि आईईईई -754 अब तक का सबसे आम है।

यह सुनिश्चित हो कि आईईईई-754 प्रयोग किया जाता है:

    सी में
  • , #ifdef __STDC_IEC_559__
  • का उपयोग सी ++ में, std::numeric_limits<float>::is_iec559 स्थिरांक
संबंधित मुद्दे