क्या कोई स्मृति में फ्लोट के प्रतिनिधित्व की व्याख्या कर सकता है?


20

यह डुप्लिकेट प्रश्न नहीं है क्योंकि मैंने पिछला प्रश्न पढ़ा था।

मुझे किसी को भी मदद समझ में कर सकते हैं how float values are stored in the memory

मेरी शंका यहां फ्लोट वैल्यू में है ' .'( for example 3.45) '.'मेमोरी में किस तरह से प्रतिनिधित्व किया जाएगा?

क्या कोई मुझे आरेख के साथ स्पष्ट कर सकता है?


21
कम से कम अपेक्षित स्रोत, विकिपीडिया के बारे में कैसे? en.wikipedia.org/wiki/Floating_point#Internal_repretation
9000

4
और आप मुख्य लेख जोड़ सकते हैं: IEEE फ़्लोटिंग पॉइंट
मौविसील

4
यदि आप मेरे जैसे हैं, और आप चीजों के साथ खेलना, इनपुट्स में डालना और आउटपुट प्राप्त करना, आदि सीखना चाहते हैं, तो इस साइट को देखें: Binaryconvert.com/convert_double.html
KChaloux

फ्लोटिंग-पॉइंट स्वरूपों की एक WIDE विविधता है, सभी अलग-अलग हैं। IEEE फ़्लोटिंग पॉइंट आजकल सबसे आम है, लेकिन यह केवल एक ही नहीं है। जब मैं अंडरग्रेजुएट था, तो मुझे सीडीसी 6600 फ्लोटिंग-पॉइंट फॉर्मेट सीखना पड़ा, और आईईईई पर इसके कुछ फायदे थे, सिंगल-प्रिसिजन के लिए सबसे बड़े मंटिसा के 48 बिट्स थे। आईईईई एकल-परिशुद्धता के लिए लगभग 24 बिट्स मंटिसा तक सीमित है, यही वजह है कि इन दिनों हर परिचयात्मक संख्यात्मक विधियां छात्रों को बताती हैं "हमेशा डबल का उपयोग करें, फ्लोट नहीं।"
बजे जॉन आर। स्ट्रॉह्म ऑग

जवाबों:


44

दशमलव बिंदु स्पष्ट रूप से कहीं भी संग्रहीत नहीं है; यह एक प्रदर्शन मुद्दा है।

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

आधार के बजाय बेस 2 का उपयोग करके, वैज्ञानिक संकेतन के एक प्रकार में एक फ्लोटिंग-पॉइंट वैल्यू का प्रतिनिधित्व करके शुरू करें। उदाहरण के लिए, 3.14159 के रूप में मान का प्रतिनिधित्व किया जा सकता है

    0.7853975 * 2 2

0.7853975 का महत्व है , उर्फ मंटिसा ; यह महत्वपूर्ण अंकों वाली संख्या का हिस्सा है। इस मान को बेस 2 से गुणा करके 2 की शक्ति से 3.14159 प्राप्त किया जाता है।

फ़्लोटिंग-पॉइंट संख्याएँ महत्व और प्रतिपादक (एक संकेत बिट के साथ) को संग्रहीत करके एन्कोडेड हैं।

एक विशिष्ट 32-बिट लेआउट कुछ इस तरह दिखता है:

 3 32222222 22211111111110000000000
 1 09876543 21098765432109876543210
+-+--------+-----------------------+
| |        |                       |
+-+--------+-----------------------+
 ^    ^                ^
 |    |                |
 |    |                +-- significand 
 |    |
 |    +------------------- exponent 
 |
 +------------------------ sign bit

हस्ताक्षरित पूर्णांक प्रकारों की तरह, उच्च-क्रम बिट संकेत इंगित करता है; 0 एक सकारात्मक मूल्य इंगित करता है, 1 नकारात्मक इंगित करता है।

अगले 8 बिट्स का उपयोग घातांक के लिए किया जाता है। एक्सपोजर सकारात्मक या नकारात्मक हो सकता है, लेकिन एक और साइन बिट को आरक्षित करने के बजाय, वे ऐसे एन्कोड किए जाते हैं जैसे कि 10000000 0 का प्रतिनिधित्व करता है, इसलिए 00000000 -128 का प्रतिनिधित्व करता है और 11111111 127 का प्रतिनिधित्व करता है।

शेष बिट्स का उपयोग महत्व के लिए किया जाता है। प्रत्येक बिट बाईं ओर से 2 गिनती की नकारात्मक शक्ति का प्रतिनिधित्व करता है, इसलिए:

    01101 = 0 * 2 -1 + 1 * 2 -2 + 1 * 2 -3 + 0 * 2 -4 + 1 * 2 -5 
          = 0.25 + 0.125 + 0.03125 
          = 0.40625

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

तो 3.14159 के हमारे मूल्य को कुछ इस तरह दर्शाया जाएगा

    0 10000010 11001001000011111100111
    ^ ^ ^
    | | |
    | | + --- महत्व = 0.7853975 ...
    | |
    | + ------------------- प्रतिपादक = २ (१३० - १२-)
    |
    + ------------------------- संकेत = 0 (सकारात्मक)

    मान = -1 (संकेत) * 2 (घातांक) * (महत्व)
    मान = -1 0 * 2 2 * 0.7853975 ...
    मान = 3.14159 ...

अब, यदि आप महत्व में सभी बिट्स जोड़ते हैं, तो आप देखेंगे कि वे कुल 0.7853975 नहीं हैं; वे वास्तव में 0.78539747 पर निकलते हैं। मूल्य को संग्रहीत करने के लिए काफी पर्याप्त बिट्स नहीं हैं ; हम केवल एक अनुमान स्टोर कर सकते हैं। महत्व में बिट्स की संख्या सटीक , या कितने महत्वपूर्ण अंक आप स्टोर कर सकते हैं निर्धारित करता है । 23 बिट्स हमें सटीकता के लगभग 6 दशमलव अंक प्रदान करते हैं। 64-बिट फ़्लोटिंग पॉइंट प्रकार सटीकता के 12 से 15 अंकों को देने के लिए पर्याप्त बिट्स प्रदान करते हैं। लेकिन ध्यान रखें कि ऐसे मूल्य हैं जिनका प्रतिनिधित्व नहीं किया जा सकता है, चाहे वे किसी भी तरह से क्यों न होंकई बिट्स आप उपयोग करते हैं। जिस प्रकार 1/3 जैसे मानों को दशमलव अंकों की एक परिमित संख्या में नहीं दर्शाया जा सकता है, उसी तरह 1/10 के मानों को परिमित संख्या में नहीं दर्शाया जा सकता है। चूंकि मान अनुमानित हैं, इसलिए उनके साथ गणना भी अनुमानित है, और गोलाई की त्रुटियां जमा होती हैं।

घातांक में बिट्स की संख्या सीमा निर्धारित करती है (न्यूनतम और अधिकतम मूल्य जो आप प्रतिनिधित्व कर सकते हैं)। लेकिन जैसे-जैसे आप अपने न्यूनतम और अधिकतम मूल्यों की ओर बढ़ते हैं, प्रतिनिधित्व योग्य मूल्यों के बीच अंतर का आकार बढ़ता जाता है। यही है, अगर आप 0.785397 और 0.785398 के बीच के मूल्यों का प्रतिनिधित्व नहीं कर सकते हैं, तो आप 7.85397 और 7.85398 के बीच या तो मूल्यों का प्रतिनिधित्व नहीं कर सकते हैं, या 78.5397 और 78.5398 के बीच या 785397.0 और 785398.0 के बीच के मूल्यों का प्रतिनिधित्व नहीं कर सकते। बहुत बड़ी संख्याओं द्वारा बहुत बड़ी (परिमाण के संदर्भ में) गुणा करते समय सावधान रहें।


"लेकिन एक और साइन बिट को आरक्षित करने के बजाय" आप जो वर्णन कर रहे हैं वह हस्ताक्षरित पूर्णांक का सटीक व्यवहार है।
शमौन

6

.सब पर संग्रहीत नहीं है। सबसे पहले, आपको इंजीनियरिंग नोटेशन को समझना चाहिए, जिसमें एक निश्चित-सटीक कारक है और एक पूर्णांक घातांक है: 11.0 · 10 0 = 1.0E0, 2 है 2.0E0, 10 है 1.0E1आदि। यह बड़ी संख्या की बहुत कम संकेतन के लिए अनुमति देता है। एक बिलियन है 1.0E9। इससे पहले का कारक Eआमतौर पर एक निश्चित-सटीक संख्या के रूप में नोट किया जाता है 1.00000E9:। इसका एक परिणाम यह है कि इस अंकन में संख्या एक बिलियन और एक = 1,000,000,001 और एक बिलियन दोनों समान हैं, जब सटीक बड़ी नहीं है। यह भी ध्यान दें कि कारक को कभी भी अग्रणी शून्य की आवश्यकता नहीं है। इसके बजाय, घातांक को तब तक हटाया जा सकता है जब तक कि ऐसा नहीं होता है।

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


3
यह "वैज्ञानिक संकेतन" है। "इंजीनियरिंग संकेतन" तब होता है जब घातांक 3. के गुणकों तक सीमित होता है
क्लेमेंट जे।

7
उस आधार 2 का उपयोग किया जाना बहुत महत्वपूर्ण है। यह निर्धारित करता है कि कौन से मूल्य वास्तव में संग्रहीत किए जा सकते हैं और कौन से नहीं हैं, और यहां तक ​​कि अगर आप एक अंतर्ज्ञान विकसित करने के लिए परेशान नहीं हो सकते हैं, जिसके लिए मूल्य (मुझे पता है कि मैं नहीं कर सकता) आपको कम से कम याद रखना चाहिए कि दशमलव अंक पूरी तरह से बेकार हैं तैरने के बारे में सोचने का तरीका।

1
@ डलेन: यदि यह मदद करता है, तो मंटिसा में प्रत्येक बिट उच्च बिट का आधा है। तो, फ़्लोट्स दो की नकारात्मक शक्तियों के योगों को स्टोर कर सकते हैं: 1/2, 1/4, 1/8, 1/16, 1/32, 1/64, 1/128, और इसी तरह मंटिसा की सीमा तक । तो एक 32-बिट में एप्सिलॉन floatहै 2^-22 * exponent, या 1/4194304 के बारे में।
ग्रेफेड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.