गाइडफ़्लोटिंग-पॉइंट कन्वर्टर्स विफल क्यों होते हैं (और दशमलव गणित इसे कैसे ठीक करता है)
फ़्लोटिंग-पॉइंट कन्वर्टर्स विफल क्यों होते हैं (और दशमलव गणित इसे कैसे ठीक करता है)
समझें कि बाइनरी फ़्लोटिंग-पॉइंट अजीब रूपांतरण अवशेष क्यों बनाता है, जब वे त्रुटियां मायने रखती हैं, और कैसे दशमलव या तर्कसंगत अंकगणित यूनिट कन्वर्टर्स को भरोसेमंद रखता है।
क्लासिक 0.1 + 0.2 समस्या इकाइयों से मिलती है
अधिकांश सीपीयू गैर-पूर्णांक संख्याओं को बाइनरी फ़्लोटिंग-पॉइंट (IEEE 754) में संग्रहीत करते हैं। दशमलव में सरल दिखने वाले अंश—0.1, 0.001, 2.54—अक्सर बाइनरी में सटीक रूप से प्रस्तुत नहीं किए जा सकते। संग्रहीत मूल्य निकटतम प्रतिनिधित्व योग्य सन्निकटन है, और सन्निकटन पर अंकगणित छोटे अवशेषों को जमा करता है।
इकाई रूपांतरण उन मानों को बार-बार गुणा और विभाजित करता है। इंच को मिलीमीटर और पीछे, या लीटर को घन मीटर और पीछे में बदलें, और आप 3 के बजाय 2.9999999997 देख सकते हैं। भौतिक रूपांतरण कारक सटीक था; कंप्यूटर प्रतिनिधित्व नहीं था.
कई डिस्प्ले में राउंडिंग के बाद अंतर अदृश्य होता है। वित्त-आसन्न खुराक, सीएनसी टूलपाथ, कानूनी भूमि क्षेत्र, या स्वचालित परीक्षण दावे के लिए जो सटीक समानता की उम्मीद करते हैं, वे अवशेष वास्तविक बग बन जाते हैं।
कौन से रूपांतरण कारक कागज पर सटीक हैं
अंतर्राष्ट्रीय इंच बिल्कुल 25.4 मिमी है। अंतर्राष्ट्रीय फुट ठीक 0.3048 मीटर है। लीटर बिल्कुल 0.001 वर्ग मीटर है। एक घन सेंटीमीटर सामान्य प्रयोगशाला अर्थ में बिल्कुल 1 एमएल है (1 सेमी³ = 10⁻⁶ m³)। ये परिभाषाएँ हैं, माप नहीं।
यदि सॉफ़्टवेयर 25.4 को बाइनरी फ़्लोट के रूप में संग्रहीत करता है, तो यह किसी भी रूपांतरण के चलने से पहले ही थोड़ा गलत हो सकता है। किसी अन्य अचूक कारक से गुणा करने पर त्रुटि बढ़ जाती है। राउंड-ट्रिप परीक्षण जो सख्त समानता का दावा करते हैं, तब भी विफल हो जाते हैं, जब एल्गोरिदम वैचारिक रूप से सही होता है।
तापमान ऑफसेट जोड़ता है: सेल्सियस ↔ केल्विन 273.15 का उपयोग करता है। वह स्थिरांक भी एक दशमलव मान है जो बाइनरी केवल अनुमानित रूप से तैरता है। एफ़िन रूपांतरण विशेष रूप से संवेदनशील होते हैं क्योंकि एक सटीक ऑफसेट जोड़ने से हर परिणाम बदल जाता है।
जहां फ़्लोटिंग-पॉइंट त्रुटियां व्यवहार में दिखाई देती हैं
यूआई कन्वर्टर्स अक्सर दशमलव की एक निश्चित संख्या में पूर्णांकन करके समस्या को छिपा देते हैं। उपयोगकर्ता साफ़ परिणाम देखते हैं और आंतरिक शोर पर कभी ध्यान नहीं देते। समस्याएँ तब प्रकट होती हैं जब कोई अन्य सिस्टम कच्चे फ्लोट का उपभोग करता है: एक सीएडी कर्नेल, एक सीएसवी निर्यात, या पूर्ण परिशुद्धता के तारों की तुलना करने वाला एक इकाई परीक्षण।
जंजीरों में जकड़े धर्मांतरण से परेशानी बढ़ती है. प्रत्येक चरण पर बाइनरी फ्लोट्स के साथ मील → यार्ड → फुट → इंच → मिलीमीटर → मीटर जाना उच्च परिशुद्धता कारक के साथ एक मील → मीटर रूपांतरण से भी बदतर है। प्रत्येक हॉप मध्यवर्ती मान को पुनः चक्रित करता है।
वर्गांकित और घनीकृत मात्राएँ त्रुटियों को और भी बदतर बना देती हैं। क्षेत्रफल और आयतन लंबाई के पैमाने को गुणा करते हैं, इसलिए जब आप (1+ε)ⁿ का विस्तार करते हैं तो लंबाई में एक छोटी सापेक्ष त्रुटि क्षेत्रफल या आयतन के सापेक्ष दो या तीन गुना बड़ी हो जाती है।
दशमलव, तर्कसंगत और निश्चित-बिंदु विकल्प
दशमलव पुस्तकालय (उदाहरण के लिए दशमलव.जेएस, बिग.जेएस, या भाषा-मूल दशमलव) संख्याओं को आधार 10 में संग्रहीत करते हैं। 0.3048 और 0.001 जैसे सटीक दशमलव कारक चयनित सटीकता के भीतर सटीक रहते हैं। यूनिट कन्वर्टर्स जो शुद्धता की परवाह करते हैं वे अक्सर दशमलव आधार इकाई के माध्यम से परिवर्तित होते हैं।
तर्कसंगत अंकगणित कारकों को पूर्णांकों के भिन्नों के रूप में संग्रहीत करता है। यदि 1 इंच = 127/5000 मीटर बिल्कुल (क्योंकि 25.4 मिमी = 127/5000 मीटर), गुणन बिल्कुल रद्द किया जा सकता है। शुद्ध पैमाने पर रूपांतरण के लिए तर्कसंगत आदर्श हैं; ऑफसेट को अभी भी तापमान के लिए सावधानी से निपटने की आवश्यकता है।
निश्चित-बिंदु गणित हर चीज को सबसे छोटे टिक की पूर्णांक गणना में मापता है - नैनोमीटर, माइक्रोलीटर, या एक इंच का हजारवां हिस्सा। पूर्णांक अंकगणित तब तक सटीक रहता है जब तक आप अतिप्रवाहित न हो जाएं। यह माप की स्पष्ट मात्रा वाले डोमेन के लिए अच्छा काम करता है।
भरोसेमंद कन्वर्टर्स के लिए व्यावहारिक नियम
सटीक कानूनी कारकों को दशमलव या परिमेय के रूप में संग्रहीत करें, जल्दबाजी में टाइप किए गए बाइनरी फ़्लोट के रूप में नहीं। इनपुट → बेस → आउटपुट को यथासंभव कम चरणों में कनवर्ट करें। केवल मनुष्यों के लिए फ़ॉर्मेट करते समय राउंड करें, और राउंडिंग मोड का दस्तावेज़ीकरण करें।
बाइनरी फ़्लोट्स पर सख्त समानता वाले कन्वर्टर्स का परीक्षण कभी न करें। पूर्ण या सापेक्ष सहनशीलता के भीतर तुलना करें, या निर्दिष्ट परिशुद्धता पर दशमलव स्ट्रिंग रूपों की तुलना करें। सुनहरे परीक्षणों को प्राथमिकता दें जो ज्ञात सटीक जोड़े का उपयोग करते हैं जैसे 1 इंच = 25.4 मिमी।
यदि आप एक कैलकुलेटर यूआई बनाते हैं, तो उपयोगी होने के लिए पर्याप्त सटीकता दिखाएं लेकिन इतने सारे अंक नहीं कि फ्लोटिंग शोर सिग्नल जैसा लगे। फ़्लोट के माध्यम से परिवर्तित करने के बाद बारह दशमलव दिखाने वाला एक लंबाई उपकरण अपनी प्रतिनिधित्व त्रुटि का विज्ञापन कर रहा है।
जब बाइनरी फ़्लोट्स अभी भी ठीक हैं
किसी न किसी तुलना, खेल, डेटा विज़ुअलाइज़ेशन और कई वैज्ञानिक सिमुलेशन फ्लोट त्रुटि को सहन करते हैं क्योंकि मॉडल अनिश्चितता प्रतिनिधित्व त्रुटि को बौना कर देती है। मुख्य बात आपकी सहनशीलता को जानना है। यदि एक मिलीमीटर मायने रखता है, तो फ्लोट्स को अनुशासन या प्रतिस्थापन की आवश्यकता होती है।
हार्डवेयर त्वरण और जीपीयू पाइपलाइन अक्सर फ़्लोट को बाध्य करते हैं। उन मामलों में, सीपीयू या सर्वर पर दशमलव में आधिकारिक रूपांतरण रखें, और जीपीयू फ्लोट्स को डिस्प्ले या इंटरमीडिएट सन्निकटन के रूप में मानें।
अच्छी इंजीनियरिंग आपके द्वारा संख्या के साथ लिए गए निर्णय के साथ संख्यात्मक प्रतिनिधित्व का मिलान करना है। विनिर्माण, चिकित्सा और कानूनी मेट्रोलॉजी के लिए इकाई रूपांतरण दशमलव या तर्कसंगत गणित का हकदार है; एक मौसम विजेट शहर के तापमान को परिवर्तित नहीं करता है। जब संदेह हो, तो सख्त प्रतिनिधित्व चुनें - दशमलव की प्रदर्शन लागत आमतौर पर साइलेंट राउंड-ट्रिप बग की लागत से कम होती है।
संबंधित कन्वर्टर
अक्सर पूछे जाने वाले प्रश्न
बार-बार कन्वर्ट करने से मेरा नंबर क्यों बदल जाता है?
बाइनरी फ़्लोटिंग-पॉइंट कई दशमलव कारकों का सटीक प्रतिनिधित्व नहीं कर सकता है। प्रत्येक गुणा या भाग एक छोटी गोलाई त्रुटि जोड़ता है। फ़्लोट्स के माध्यम से राउंड-ट्रिप रूपांतरण अक्सर मूल बिट्स को पुनर्स्थापित करने में विफल रहता है, भले ही रूपांतरण कारक वैचारिक रूप से सटीक हों।
क्या इकाई रूपांतरण के लिए दोहरी परिशुद्धता पर्याप्त है?
डिस्प्ले राउंडिंग के बाद कई रोजमर्रा के रूपांतरणों के लिए डबल प्रिसिजन (फ्लोट 64) पर्याप्त है, लेकिन जब आपको बिट-स्टेबल राउंड ट्रिप, कानूनी मेट्रोलॉजी, या सख्त स्वचालित परीक्षणों की आवश्यकता होती है तो यह सटीक दशमलव कारकों का विकल्प नहीं है। आधिकारिक कन्वर्टर्स के लिए दशमलव या परिमेय को प्राथमिकता दें।
मुझे परीक्षणों में कनवर्टर परिणामों की तुलना कैसे करनी चाहिए?
घोषित परिशुद्धता पर तुलना करें, दशमलव स्ट्रिंग समानता का उपयोग करें, या पूर्ण और सापेक्ष सहनशीलता का दावा करें। कई अंकगणितीय चरणों के बाद सटीक बाइनरी समानता की अपेक्षा करने से बचें।