समानता के लिए फ्लोटिंग-पॉइंट नंबरों की सामान्य ज्ञान की तुलना गलत नहीं की जा सकती है। फ़्लोटिंग-पॉइंट नंबर पूर्णांकों से अलग नहीं हैं: यदि आप "a == b" का मूल्यांकन करते हैं, तो आप सत्य होंगे यदि वे समान संख्याएँ और झूठे हों अन्यथा (इस समझ के साथ कि दो NaN समान संख्या में नहीं हैं)।
वास्तविक समस्या यह है: अगर मैंने कुछ गणनाएँ की हैं और मुझे यकीन नहीं है कि मुझे जिन दो नंबरों की तुलना करनी है, वे बिल्कुल सही हैं, तो क्या? यह समस्या फ्लोटिंग-पॉइंट के लिए समान है क्योंकि यह पूर्णांकों के लिए है। यदि आप पूर्णांक अभिव्यक्ति "7/3 * 3" का मूल्यांकन करते हैं, तो यह "7 * 3/3" के बराबर नहीं होगा।
तो मान लीजिए हमने पूछा "मैं समानता के लिए पूर्णांक की तुलना कैसे करूं?" ऐसी स्थिति में। एक भी उत्तर नहीं है; आपको क्या करना चाहिए यह विशिष्ट स्थिति पर निर्भर करता है, विशेष रूप से आपके पास किस प्रकार की त्रुटियां हैं और आप क्या हासिल करना चाहते हैं।
यहाँ कुछ संभावित विकल्प दिए गए हैं।
यदि आप "सही" परिणाम प्राप्त करना चाहते हैं यदि गणितीय रूप से सटीक संख्याएं समान होंगी, तो आप यह साबित करने के लिए कि आपके द्वारा किए गए गणनाओं के गुणों का उपयोग करने का प्रयास कर सकते हैं कि आपको दो संख्याओं में समान त्रुटियां मिलती हैं। यदि वह संभव है, और आप दो संख्याओं की तुलना करते हैं जो उन अभिव्यक्तियों से उत्पन्न होती हैं जो समान संख्याएं देती हैं यदि वास्तव में गणना की जाती है, तो आपको तुलना से "सच" मिलेगा। एक और दृष्टिकोण यह है कि आप गणना के गुणों का विश्लेषण कर सकते हैं और यह साबित कर सकते हैं कि त्रुटि कभी भी एक निश्चित राशि से अधिक नहीं होती है, शायद किसी निरपेक्ष राशि या किसी इनपुट या आउटपुट में से किसी एक के सापेक्ष राशि। उस स्थिति में, आप पूछ सकते हैं कि क्या दो परिकलित संख्याएं उस राशि से भिन्न होती हैं, और यदि वे अंतराल के भीतर हैं तो "सही" लौटें। यदि आप किसी त्रुटि को प्रमाणित नहीं कर सकते हैं, आप अनुमान लगा सकते हैं और सर्वोत्तम के लिए आशा कर सकते हैं। अनुमान लगाने का एक तरीका कई यादृच्छिक नमूनों का मूल्यांकन करना और यह देखना है कि परिणामों में आपको किस प्रकार का वितरण मिलता है।
बेशक, चूंकि हम केवल यह निर्धारित करते हैं कि आपको "सही" मिलता है यदि गणितीय रूप से सटीक परिणाम समान हैं, तो हमने इस संभावना को खुला छोड़ दिया कि आपको असमान होने पर भी "सत्य" मिलता है। (वास्तव में, हम हमेशा "सच" वापस करके आवश्यकता को पूरा कर सकते हैं। यह गणना को सरल बनाता है लेकिन आम तौर पर अवांछनीय है, इसलिए मैं नीचे की स्थिति में सुधार करने पर चर्चा करूंगा।)
यदि आप गणितीय रूप से "गलत" परिणाम प्राप्त करना चाहते हैं यदि गणितीय रूप से सटीक संख्याएं असमान होंगी, तो आपको यह साबित करने की आवश्यकता है कि यदि गणितीय रूप से सटीक संख्याएं असमान होंगी तो संख्याओं का आपका मूल्यांकन अलग-अलग संख्याओं को उत्पन्न करता है। कई सामान्य स्थितियों में व्यावहारिक उद्देश्यों के लिए यह असंभव हो सकता है। तो आइए एक विकल्प पर विचार करें।
एक उपयोगी आवश्यकता यह हो सकती है कि यदि हमें गणितीय रूप से सटीक संख्या एक निश्चित राशि से अधिक हो तो "गलत" परिणाम मिलता है। उदाहरण के लिए, शायद हम यह गणना करने जा रहे हैं कि कंप्यूटर गेम में फेंकी गई एक गेंद कहां गई, और हम जानना चाहते हैं कि क्या इसने बल्ले को मारा। इस मामले में, हम निश्चित रूप से "सच" प्राप्त करना चाहते हैं यदि गेंद बल्ले से टकराती है, और यदि गेंद बल्ले से दूर है, तो हम "झूठा" प्राप्त करना चाहते हैं, और यदि गेंद अंदर है तो हम गलत "सही" उत्तर स्वीकार कर सकते हैं। गणितीय रूप से सटीक अनुकार बल्ले से चूक गया लेकिन बल्ले से टकराने के मिलीमीटर के भीतर है। उस मामले में, हमें यह साबित करने (या अनुमान / अनुमान) करने की आवश्यकता है कि गेंद की स्थिति और बल्ले की स्थिति की हमारी गणना में एक मिलीमीटर (ब्याज के सभी पदों के लिए) की संयुक्त त्रुटि है। यह हमें हमेशा लौटने की अनुमति देगा ”
तो, आप कैसे तय करते हैं कि फ्लोटिंग-पॉइंट नंबरों की तुलना करते समय क्या लौटना है यह आपकी विशिष्ट स्थिति पर बहुत निर्भर करता है।
जैसा कि आप गणनाओं के लिए त्रुटि सीमा साबित करने के बारे में कैसे जाते हैं, यह एक जटिल विषय हो सकता है। IEEE 754 मानक के राउंड-पास मोड में उपयोग करने वाला कोई भी फ्लोटिंग-पॉइंट कार्यान्वयन किसी भी बेसिक ऑपरेशन (विशेष रूप से गुणा, विभाजन, जोड़, घटाव, वर्गमूल) के लिए सटीक परिणाम के निकटतम फ्लोटिंग-पॉइंट नंबर देता है। (टाई के मामले में, राउंड कम बिट सम है।) (वर्गमूल और विभाजन के बारे में विशेष रूप से सावधान रहें; आपकी भाषा कार्यान्वयन उन विधियों का उपयोग कर सकती है जो उन लोगों के लिए IEEE 754 के अनुरूप नहीं हैं।) इस आवश्यकता के कारण, हम जानते हैं। एक परिणाम में त्रुटि सबसे कम महत्वपूर्ण बिट के मूल्य के 1/2 से अधिक है। (यदि यह अधिक होता, तो गोलाई एक अलग संख्या में चली जाती जो 1/2 मान के भीतर होती है।)
वहाँ से जाने पर बहुत अधिक जटिल हो जाता है; अगला चरण एक ऑपरेशन कर रहा है, जहां इनपुट में से एक में पहले से ही कुछ त्रुटि है। सरल अभिव्यक्तियों के लिए, अंतिम त्रुटि पर एक सीमा तक पहुंचने के लिए गणना के माध्यम से इन त्रुटियों का पालन किया जा सकता है। व्यवहार में, यह केवल कुछ स्थितियों में किया जाता है, जैसे उच्च गुणवत्ता वाले गणित पुस्तकालय पर काम करना। और, निश्चित रूप से, आपको सटीक नियंत्रण की आवश्यकता है कि कौन से ऑपरेशन किए जाते हैं। उच्च-स्तरीय भाषाएं अक्सर कंपाइलर को बहुत सुस्त कर देती हैं, इसलिए आपको पता नहीं चलता कि किस क्रम में ऑपरेशन किए जाते हैं।
इस विषय के बारे में और भी बहुत कुछ लिखा जा सकता है (और है), लेकिन मुझे वहाँ रुकना होगा। संक्षेप में, इसका उत्तर यह है: इस तुलना के लिए कोई पुस्तकालय दिनचर्या नहीं है क्योंकि कोई भी एक समाधान नहीं है जो अधिकांश आवश्यकताओं को फिट करता है जो एक पुस्तकालय दिनचर्या में डालने लायक है। (यदि किसी रिश्तेदार या पूर्ण त्रुटि अंतराल के साथ तुलना करना आपके लिए पर्याप्त है, तो आप इसे बिना लाइब्रेरी रूटीन के कर सकते हैं।)