0

IEEE-754 फ़्लोट विज़ुअलाइज़र

देखें कि एक दशमलव संख्या IEEE-754 फ़्लोट के रूप में कैसे संग्रहीत होती है — साइन बिट, एक्सपोनेंट बिट्स और मैन्टिसा बिट्स — और क्यों 0.1 जैसी संख्याएँ सटीक रूप से संग्रहीत नहीं होतीं।

🔒 पूरी तरह से आपके ब्राउज़र में संसाधित - आपके द्वारा यहां दर्ज की गई कोई भी चीज़ कभी भी अपलोड नहीं की जाती है।

प्रोसेस हो रहा है... 0%
नॉर्मलाइज़ किया जा रहा है
एक्सपोनेंट बायस की गणना हो रही है
मैन्टिसा बिट्स का विस्तार हो रहा है
पूर्ण

परिणाम

हर फ़्लोटिंग-पॉइंट संख्या जो एक कंप्यूटर संग्रहीत करता है — एक JavaScript संख्या, एक C फ़्लोट, एक Python फ़्लोट — IEEE 754 के तहत एक ही तरह से एनकोड होती है: एक साइन बिट, एक्सपोनेंट बिट्स का एक ब्लॉक, और मैन्टिसा (फ़्रैक्शन) बिट्स का एक ब्लॉक। सिंगल प्रेसिजन (32-बिट) 1 साइन बिट, 8 एक्सपोनेंट बिट्स और 23 मैन्टिसा बिट्स का उपयोग करता है; डबल प्रेसिजन (64-बिट), लगभग हर भाषा के डिफ़ॉल्ट संख्या प्रकार के पीछे का प्रारूप, 1 साइन बिट, 11 एक्सपोनेंट बिट्स और 52 मैन्टिसा बिट्स का उपयोग करता है। यह उपकरण आपके द्वारा टाइप की गई किसी भी दशमलव संख्या को लेता है, उसे ब्राउज़र के अपने DataView/ArrayBuffer फ़्लोट एनकोडर का उपयोग करके किसी भी चौड़ाई में एनकोड करता है — वही तंत्र जिस पर आपका कोड वास्तव में चलता है — और प्रत्येक बिट को उसके क्षेत्र के अनुसार रंग देता है।

एनकोडिंग स्वयं तीन चरणों का पालन करती है, और यह उपकरण केवल अंतिम बिट्स दिखाने के बजाय उन सभी से गुज़रता है। पहला, नॉर्मलाइज़ेशन: संख्या को 1.मैन्टिसा × 2^एक्सपोनेंट के रूप में फिर से लिखा जाता है, जिसमें बाइनरी बिंदु से पहले ठीक एक अशून्य अंक होता है (इसके लिए बहुत छोटी संख्याएँ इसके बजाय सबनॉर्मल उपचार प्राप्त करती हैं, जिसमें कोई अंतर्निहित अग्रणी 1 नहीं होता है)। दूसरा, एक्सपोनेंट बायस: चूँकि एक्सपोनेंट फ़ील्ड को धनात्मक और ऋणात्मक दोनों एक्सपोनेंट को एक अचिह्नित संख्या के रूप में संग्रहीत करना होता है, फ़ील्ड को बाइनरी में लिखे जाने से पहले एक निश्चित बायस (सिंगल प्रेसिजन के लिए 127, डबल के लिए 1023) जोड़ा जाता है। तीसरा, भिन्नात्मक मैन्टिसा को क्लासिक “दो से गुणा करें, पूर्णांक भाग को अगले बिट के रूप में लें, शेष को रखें” विधि से बिट दर बिट विस्तारित किया जाता है — तब तक दोहराया जाता है जब तक मैन्टिसा फ़ील्ड भर न जाए, जिस बिंदु पर बचे हुए बिट्स तय करते हैं कि परिणाम ऊपर या नीचे राउंड होता है (राउंड-हाफ़-टू-ईवन, IEEE-754 डिफ़ॉल्ट)।

यही कारण है कि 0.1 जैसी सामान्य संख्या सटीक रूप से संग्रहीत नहीं होती है। बाइनरी में, 0.1 एक आवर्ती भिन्न है (0.0001100110011…, हमेशा के लिए), इसलिए कोई भी सीमित मैन्टिसा इसे सटीकता से नहीं रख सकता — इसे कहीं न कहीं राउंड ऑफ़ करना ही पड़ता है। 0.1 को 32-बिट फ़्लोट के रूप में एनकोड करें और बिट्स को वापस पढ़ें, तो आपको 0.1 वापस नहीं मिलता: आपको ठीक 0.100000001490116119384765625 मिलता है। डबल प्रेसिजन के पास काम करने के लिए 29 अधिक मैन्टिसा बिट्स हैं, इसलिए इसकी राउंडिंग त्रुटि बहुत छोटी है, लेकिन यह शून्य भी नहीं है — 0.1 एक 64-बिट डबल के रूप में ठीक 0.1000000000000000055511151231257827021181583404541015625 है। यह उपकरण उस सटीक संग्रहीत मान की गणना बड़े-पूर्णांक अंकगणित (कोई फ़्लोटिंग-पॉइंट शॉर्टकट नहीं) से करता है ताकि आपने जो टाइप किया और हार्डवेयर वास्तव में क्या रखता है, के बीच का अंतर कभी छिपा या अनुमानित न हो।

विशेष मानों को सामान्य एनकोडिंग के बजाय सटीक, आरक्षित बिट पैटर्न मिलते हैं: शून्य और ऋणात्मक शून्य में सभी-शून्य एक्सपोनेंट और मैन्टिसा बिट्स होते हैं (केवल साइन बिट भिन्न होता है), ±अनंत में सभी-एक एक्सपोनेंट बिट्स होते हैं और सभी-शून्य मैन्टिसा, और NaN में सभी-एक एक्सपोनेंट बिट्स होते हैं और कम से कम एक मैन्टिसा बिट सेट होता है। यहाँ सब कुछ स्थानीय रूप से आपके ब्राउज़र में चलता है — आप जो कुछ भी टाइप करते हैं वह कहीं अपलोड नहीं होता — जो इसे फ़्लोटिंग-पॉइंट बग्स के लिए वास्तविक अंतर्ज्ञान बनाने का एक सुरक्षित स्थान बनाता है: क्यों `0.1 + 0.2 !== 0.3` लगभग हर प्रोग्रामिंग भाषा में, क्यों ग्राफ़िक्स कोड में float32 टेक्सचर सटीकता खो देते हैं जो float64 नहीं खोते, और क्यों वित्तीय कोड को आम तौर पर बाइनरी फ़्लोटिंग पॉइंट से पूरी तरह बचना चाहिए।