0

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

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

Buy Me a Coffee at ko-fi.com
प्रसंस्करण... 0%
सामान्य बनाना
कंप्यूटिंग घातांक पूर्वाग्रह
मंटिसा बिट्स का विस्तार
हो गया

नतीजा

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

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

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

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