floating point - IEEE754 NaN मानों के लिए झूठी लौटने वाली सभी तुलनाओं के लिए तर्क क्या है?




floating-point comparison (8)

NaN एक निहित नया उदाहरण है (एक विशेष प्रकार की रनटाइम त्रुटि)। इसका मतलब है NaN !== NaN उसी कारण से new Error !== new Error ;

और ध्यान रखें कि इस तरह के निहितार्थ को त्रुटियों के बाहर भी देखा जाता है, उदाहरण के लिए नियमित अभिव्यक्तियों के संदर्भ में इसका अर्थ है /a/ !== /a/ जो कि new RegExp('a') !== new RegExp('a') लिए सिंटैक्स चीनी है new RegExp('a') !== new RegExp('a')

NaN मानों की तुलना अन्य सभी मूल्यों से भिन्न क्यों होती है? यही है, ऑपरेटरों के साथ सभी तुलना ==, <=,> =, <,> जहां एक या दोनों मान NaN झूठे हैं, अन्य सभी मूल्यों के व्यवहार के विपरीत।

मुझे लगता है कि यह किसी भी तरह से संख्यात्मक गणना को सरल बनाता है, लेकिन मुझे स्पष्ट रूप से कारण नहीं मिला, कहान द्वारा आईईईई 754 की स्थिति पर व्याख्यान नोट्स में भी नहीं, जो अन्य डिजाइन निर्णयों पर विस्तार से चर्चा करता है।

सरल डेटा प्रोसेसिंग करते समय यह विचलित व्यवहार परेशानी पैदा कर रहा है। उदाहरण के लिए, रिकॉर्ड की सूची को सॉर्ट करते समय सी प्रोग्राम में कुछ वास्तविक मूल्य वाले फ़ील्ड को लिखते समय मुझे NaN को अधिकतम तत्व के रूप में संभालने के लिए अतिरिक्त कोड लिखना होगा, अन्यथा सॉर्ट एल्गोरिदम भ्रमित हो सकता है।

संपादित करें: अब तक के सभी उत्तरों का तर्क है कि नाएन की तुलना करना व्यर्थ है।

मैं सहमत हूं, लेकिन इसका मतलब यह नहीं है कि सही उत्तर झूठा है, बल्कि यह एक गैर-बूलियन (NaB) होगा, जो सौभाग्य से अस्तित्व में नहीं है।

तो तुलना के लिए सही या गलत लौटने की पसंद मनमाने ढंग से मेरे विचार में है, और सामान्य डेटा प्रोसेसिंग के लिए यह फायदेमंद होगा यदि यह सामान्य कानूनों का पालन करता है (== की प्रतिबिंबिता, <tr = या=, trichotomy <), डेटा संरचनाएं जो इन कानूनों पर भरोसा करते हैं भ्रमित हो जाते हैं।

इसलिए मैं इन कानूनों को तोड़ने के कुछ ठोस लाभ मांग रहा हूं, न केवल दार्शनिक तर्क।

2 संपादित करें: मुझे लगता है कि अब मैं समझता हूं कि क्यों नैन अधिकतम बनाना एक बुरा विचार होगा, यह ऊपरी सीमाओं की गणना को गड़बड़ कर देगा।

NaN! = NaN एक लूप में अभिसरण का पता लगाने से बचने के लिए वांछनीय हो सकता है

while (x != oldX) {
    oldX = x;
    x = better_approximation(x);
}

हालांकि, एक छोटी सीमा के साथ पूर्ण अंतर की तुलना करके बेहतर लिखा जाना चाहिए। तो आईएमएचओ यह नाएन में रिफ्लेक्सिविटी तोड़ने के लिए अपेक्षाकृत कमजोर तर्क है।


NaN को एक अनिर्धारित राज्य / संख्या के रूप में माना जा सकता है। 0/0 की अवधारणा के समान अपरिभाषित या वर्ग (-3) (वास्तविक संख्या प्रणाली में जहां फ़्लोटिंग पॉइंट रहता है)।

इस अनिर्धारित राज्य के लिए NaN को प्लेसहोल्डर के रूप में उपयोग किया जाता है। गणितीय बोलने, अपरिभाषित अपरिभाषित के बराबर नहीं है। न तो आप कह सकते हैं कि एक अपरिभाषित मान किसी अन्य अपरिभाषित मान से अधिक या कम है। इसलिए सभी तुलना झूठी वापसी करते हैं।

यह व्यवहार उन मामलों में भी फायदेमंद है जहां आप sqrt (-3) से sqrt (-2) की तुलना करते हैं। वे दोनों नाएन वापस आ जाएंगे, लेकिन वे समान मूल्य वापस करने के बावजूद समकक्ष नहीं हैं। इसलिए NaN से निपटने के दौरान समानता हमेशा झूठी लौट रही है वांछित व्यवहार है।


अभी तक एक और समानता में फेंकने के लिए। अगर मैं आपको दो बक्से सौंपता हूं, और आपको बताता हूं कि उनमें से कोई भी एक सेब नहीं है, तो क्या आप मुझे बताएंगे कि बक्से में एक ही चीज़ है?

NaN में कोई जानकारी नहीं है कि कुछ क्या है, बस यह नहीं है। इसलिए इन तत्वों को कभी भी बराबर नहीं कहा जा सकता है।


क्योंकि गणित वह क्षेत्र है जहां संख्याएं "बस मौजूद हैं"। कंप्यूटिंग में आपको उन नंबरों को प्रारंभ करना होगा और अपनी आवश्यकताओं के अनुसार अपना राज्य रखना होगा। उन पुराने दिनों में स्मृति प्रारंभिक तरीके उन तरीकों से काम करता था जिन पर आप कभी भरोसा नहीं कर सकते थे। आप कभी भी इस बारे में सोचने की अनुमति नहीं दे सकते "ओह, यह हर समय 0xCD के साथ शुरू किया जाएगा, मेरा अहंकार तोड़ा नहीं जाएगा"

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

यह सिर्फ ग्रीस है जिसे आप सृजन में नए चर में डाल सकते हैं, कंप्यूटर मेमोरी से यादृच्छिक नरक प्रोग्रामिंग के बजाय। और आपका एल्गोरिदम जो भी हो, तोड़ नहीं होगा।

इसके बाद, जब भी आप अचानक यह पता लगाते हैं कि आपका एल्गोरिदम NaNs का उत्पादन कर रहा है, तो इसे एक बार में प्रत्येक शाखा में देखकर इसे साफ़ करना संभव है। फिर, "हमेशा झूठा" नियम इस में बहुत मदद कर रहा है।


मुझे लगता है कि NaN (संख्या नहीं) का अर्थ यह है कि: यह एक संख्या नहीं है और इस प्रकार इसकी तुलना करना वास्तव में समझ में नहीं आता है।

यह null ऑपरेंड के साथ एसक्यूएल में अंकगणित की तरह थोड़ा है: वे सभी null में परिणाम।

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


मेरे लिए, इसे समझाने का सबसे आसान तरीका यह है:

मेरे पास कुछ है और यदि यह एक सेब नहीं है तो क्या यह एक नारंगी है?

आप NaN की तुलना किसी अन्य चीज़ से नहीं कर सकते (यहां तक ​​कि स्वयं) क्योंकि इसका कोई मूल्य नहीं है। यह भी कोई मूल्य हो सकता है (एक संख्या को छोड़कर)।

मेरे पास कुछ है और यदि यह किसी संख्या के बराबर नहीं है तो क्या यह एक स्ट्रिंग है?


यह केवल असाधारण दिखता है क्योंकि अधिकांश प्रोग्रामिंग वातावरण जो NaNs को अनुमति देते हैं, वे 3-मूल्यवान तर्क भी नहीं देते हैं। यदि आप मिश्रण में 3-मूल्यवान तर्क फेंकते हैं, तो यह लगातार हो जाता है:

  • (2.7 == 2.7) = सच
  • (2.7 == 2.6) = झूठी
  • (2.7 == NaN) = अज्ञात
  • (NaN == NaN) = अज्ञात

यहां तक ​​कि .NET भी एक bool? operator==(double v1, double v2) प्रदान नहीं करता है bool? operator==(double v1, double v2) bool? operator==(double v1, double v2) ऑपरेटर, तो आप अभी भी मूर्खतापूर्ण (NaN == NaN) = false परिणाम से फंस गए हैं।


हालांकि मैं मानता हूं कि किसी वास्तविक संख्या के साथ नाएन की तुलना अनियंत्रित होनी चाहिए, मुझे लगता है कि नाएन की तुलना स्वयं के साथ करने का एकमात्र कारण है। कैसे, उदाहरण के लिए कोई NaNs और शांत NaN संकेतों के बीच अंतर खोजता है? यदि हम बूलियन मानों (यानी थोड़ा-वेक्टर) के सेट के रूप में सिग्नल के बारे में सोचते हैं तो कोई यह पूछ सकता है कि बिट-वैक्टर समान या अलग हैं या तदनुसार सेट ऑर्डर करें। उदाहरण के लिए, अधिकतम पक्षपातपूर्ण एक्सपोनेंट को डीकोड करने पर, यदि महत्व को छोड़ दिया गया था ताकि बाइनरी प्रारूप के सबसे महत्वपूर्ण बिट पर महत्व के सबसे महत्वपूर्ण बिट को संरेखित किया जा सके, तो ऋणात्मक मूल्य एक शांत NaN होगा और कोई सकारात्मक मूल्य होगा एक संकेत NaN हो। ज़ीरो निश्चित रूप से अनंत के लिए आरक्षित है और तुलना अनियंत्रित होगी। एमएसबी संरेखण विभिन्न बाइनरी प्रारूपों से भी सिग्नल की सीधी तुलना की अनुमति देगा। सिग्नल के एक ही सेट के साथ दो नाएन इसलिए बराबर होंगे और समानता के लिए अर्थ देंगे।





iec10967