अभी तक मैंने फ़्लोटिंग पॉइंट नंबरों की समानता से निपटने वाली कई पोस्ट देखी हैं। एक सवाल का मानक जवाब जैसे "हम कैसे तय कर सकते हैं कि एक्स और वाई बराबर हैं?"क्या हमें * रिश्तेदार * त्रुटि के विरुद्ध समानता के लिए फ़्लोटिंग पॉइंट नंबरों की तुलना करनी चाहिए?
abs(x - y) < epsilon
जहां एप्सिलॉन एक तय, छोटे स्थिर है है। ऐसा इसलिए है क्योंकि "ऑपरेंड" एक्स और वाई अक्सर कुछ गणना के परिणाम होते हैं जहां एक गोलाकार त्रुटि शामिल होती है, इसलिए मानक समानता ऑपरेटर == हमारा मतलब नहीं है, और हमें वास्तव में क्या पूछना चाहिए कि क्या x और y हैं बंद करें, बराबर नहीं।
अब, मुझे लगता है कि अगर एक्स वाई करने के लिए "लगभग बराबर" है, तो भी एक्स * 10^20 y * 10^20 "लगभग बराबर" होना चाहिए, इस अर्थ में कि रिश्तेदार त्रुटि होना चाहिए वही (लेकिन "रिश्तेदार" क्या है?)। लेकिन इन बड़ी संख्याओं के साथ, उपर्युक्त परीक्षण विफल हो जाएगा, यानी वह समाधान "स्केल" नहीं करता है।
आप इस मुद्दे से कैसे निपटेंगे? क्या हमें संख्याओं को पुन: सहेजना चाहिए या ईपीएसलॉन को पुन: सहेजना चाहिए? कैसे? (या मेरे अंतर्ज्ञान गलत क्या है?)
यहाँ एक related question है, लेकिन मैं अपने को स्वीकार कर लिया जवाब पसंद नहीं है, reinterpret_cast बात के लिए एक सा मेरे लिए मुश्किल लगता है, मुझे समझ नहीं आता क्या हो रहा है। कृपया एक सरल परीक्षण प्रदान करने का प्रयास करें।
धन्यवाद। पेपर भी कठोर कलाकारों के पीछे की प्रेरणा के बारे में बताता है (हालांकि सामान्य कोड में मैं समझदारी का चयन करता हूं और सभी फ्लोट समाधानों में से एक का उपयोग करता हूं :) –
उपरोक्त लिंक का अद्यतन संस्करण है [फ्लोटिंग पॉइंट नंबर, 2012 संस्करण की तुलना करना] (http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/) – sfstewman