दिलचस्प पोस्ट
अगर मैं एक टेम्पलेट में सिर्फ एक विधि का विशेषज्ञ करना चाहता हूं, तो मैं यह कैसे कर सकता हूं? जावास्क्रिप्ट में दो सरणियों का प्रतिच्छेदन करें जावा में यूटीसी या जीएमटी में मैं वर्तमान दिनांक और समय कैसे प्राप्त करूं? Symfony 2 में सीएसएस फ़ाइलों में संपत्ति का पथ बैश चर असाइनमेंट में कमांड को त्रुटि नहीं मिली अक्षम विशेषता के लिए सही मान मैं एक रेल संपादन फ़ील्ड में दिखाए गए मूल्य को कैसे प्रारूपित कर सकता हूं? सूची को संख्याबद्ध रूप से कैसे सॉर्ट करना है? कमांड लाइन से एक JAR फ़ाइल चलाएं और वर्गपथ निर्दिष्ट करें JQuery के साथ डाउनलोड लिंक के पीछे फ़ाइल का आकार ढूंढें IPhone के उद्देश्य-सी के लिए Google दिशा-एपीआई पॉलीलाइन फ़ील्ड को लेट लंबे अंकों में कैसे डिकोड किया जाए? "Git stash save –all" से कैसे उबरने के लिए? सामान्य वापसी प्रकार ऊपरी बाउंड – इंटरफ़ेस बनाम वर्ग – आश्चर्यजनक रूप से मान्य कोड क्या स्कला कन्स्ट्रक्टर पैरामीटर को निजी वैल में डिफॉल्ट करता है? लोडिंग से छवियों को रोकें

क्या हमें * सापेक्ष * त्रुटि के खिलाफ समानता के लिए अस्थायी बिंदु संख्याओं की तुलना करनी चाहिए?

अब तक मैंने बहुत से पदों को फ़्लोटिंग प्वाइंट नंबर की समानता से निपटने के लिए देखा है। एक सवाल का मानक जवाब "जैसे हम तय करेंगे कि एक्स और वाई बराबर हैं?" है

abs(x - y) < epsilon 

जहां एप्सिलॉन एक निश्चित , छोटे स्थिरांक है ऐसा इसलिए है क्योंकि "ऑपरेंड" एक्स और वाई अक्सर कुछ गणना के परिणाम होते हैं, जहां एक गोल त्रुटि शामिल होती है, इसलिए मानक समानता ऑपरेटर == ऐसा नहीं है जो हमारा मतलब है, और हमें वास्तव में यह पूछना चाहिए कि क्या एक्स और वाई बंद हैं , बराबर नहीं।

अब, मुझे लगता है कि यदि y "के बराबर लगभग" होता है, तो भी x * 10 ^ 20 को "लगभग बराबर" होना चाहिए, जो कि * 10 ^ 20, इस अर्थ में कि रिश्तेदार त्रुटि समान होगी (लेकिन "रिश्तेदार " किसका?)। लेकिन इन बड़ी संख्याओं के साथ, उपरोक्त परीक्षण असफल हो जायेगा, यानी यह समाधान "स्केल" नहीं करता है।

आप इस मुद्दे से कैसे निपटेंगे? क्या हमें संख्याओं को पुनर्विक्रय करना चाहिए या एपिसलॉन को पुन: आकार देना चाहिए? कैसे? (या मेरा अंतर्ज्ञान गलत है?)

यह एक संबंधित प्रश्न है , लेकिन मुझे उसका स्वीकृत उत्तर पसंद नहीं है, क्योंकि पुन: संदर्भ एनआईटी बात मेरे लिए थोड़ा मुश्किल लगता है, मुझे नहीं पता कि क्या हो रहा है कृपया एक साधारण परीक्षण प्रदान करने का प्रयास करें

Solutions Collecting From Web of "क्या हमें * सापेक्ष * त्रुटि के खिलाफ समानता के लिए अस्थायी बिंदु संख्याओं की तुलना करनी चाहिए?"

यह सभी विशिष्ट समस्या डोमेन पर निर्भर करता है। हां, सामान्य मामले में सापेक्ष त्रुटि का उपयोग करना अधिक सही होगा, लेकिन यह काफी कम कुशल हो सकता है क्योंकि इसमें एक अतिरिक्त अस्थायी-बिंदु विभाजन शामिल है। यदि आप अपनी समस्या में संख्याओं के अनुमानित स्केल को जानते हैं, तो एक पूर्ण त्रुटि का उपयोग स्वीकार्य है।

इस पृष्ठ में फ्लोट की तुलना करने के लिए कई तकनीकों की रूपरेखा है यह कई महत्वपूर्ण मुद्दों पर भी जाता है, जैसे कि उपनगरीय, अनन्तता, और नाओएन के साथ। यह एक महान पढ़ा है, मैं अत्यधिक इसे पढ़ने के माध्यम से सभी तरह की सिफारिश।

एक वैकल्पिक समाधान के रूप में, न सिर्फ संख्याओं को गोल या छोटा किया जाए और फिर सीधा तुलना करें? अग्रिम में महत्वपूर्ण अंकों की संख्या निर्धारित करके, आप उस बाध्यता के भीतर सटीकता के कुछ निश्चित हो सकते हैं।

समस्या यह है कि बहुत बड़ी संख्या के साथ, एप्सिलॉन की तुलना करना विफल हो जाएगा।

शायद एक बेहतर (लेकिन धीमी) समाधान विभाजन का उपयोग करना होगा, उदाहरण:

 div(max(a, b), min(a, b)) < eps + 1 

अब 'त्रुटि' रिश्तेदार होगा।

सापेक्ष त्रुटि का उपयोग करना पूर्ण त्रुटियों का उपयोग करने के लिए कम से कम उतना बुरा नहीं है, लेकिन गोल समस्याओं के कारण शून्य के पास मूल्यों के लिए सूक्ष्म समस्याएं हैं। बिल्कुल सही से दूर है, लेकिन कुछ मजबूत एल्गोरिथम पूर्ण और रिश्तेदार त्रुटि को जोड़ती है:

 boolean approxEqual(float a, float b, float absEps, float relEps) { // Absolute error check needed when comparing numbers near zero. float diff = abs(a - b); if (diff <= absEps) { return true; } // Symmetric relative error check without division. return (diff <= relEps * max(abs(a), abs(b))); } 

मैंने इस कोड को ब्रूस डावसन के उत्कृष्ट लेख तुलना फ्लोटिंग प्वाइंट संख्या, 2012 संस्करण से अनुकूलित किया है, जो किसी भी अस्थायी बिंदु की तुलना करने के लिए एक आवश्यक पढ़ा है – कई नुकसान के साथ एक आश्चर्यजनक जटिल विषय

अधिकांश समय जब कोड मूल्यों की तुलना करता है, तो ऐसा कुछ ऐसा प्रश्न पूछने के लिए कर रहा है। उदाहरण के लिए:

  1. यदि मुझे पता है कि एक्स के मान दिए जाने पर फ़ंक्शन क्या लौटाएगा, तो क्या मैं मान सकता हूँ कि वाई दिए जाने पर यह वही काम करेगा?

  2. यदि मेरे पास एक समारोह की गणना करने की कोई विधि है जो धीमी लेकिन सटीक है, तो मैं गति के बदले में कुछ गलतता स्वीकार करने के लिए तैयार हूं और मैं उस उम्मीदवार की कवायद का परीक्षण करना चाहता हूं जो बिल को फिट करने लगता है, उस समारोह से आउटपुट काफी करीब है ज्ञात-सटीक एक को "सही" माना जाना चाहिए

पहले प्रश्न का उत्तर देने के लिए, कोड आदर्श रूप से थोड़ा-सा तुलना करना चाहिए, यद्यपि जब तक कि कोई भाषा 200 9 में आईईईई -754 में जोड़े गए नए ऑपरेटरों का समर्थन न करे, जो आदर्श से कम कुशल हो सकती है। दूसरे प्रश्न का उत्तर देने के लिए, हमें यह परिभाषित करना चाहिए कि किस प्रकार सटीकता की आवश्यकता है और उसके खिलाफ परीक्षण करें

मुझे नहीं लगता कि एक सामान्य प्रयोजन के तरीके में काफी योग्यता है जो समान चीजें हैं जो करीब हैं, क्योंकि विभिन्न अनुप्रयोगों में पूर्ण और सापेक्ष सहिष्णुता दोनों के लिए अलग-अलग आवश्यकताओं की आवश्यकता होगी, इस आधार पर कि परीक्षण के उत्तर देने के लिए कौन से सटीक प्रश्न हैं।