floating point - NaN NaN के बराबर क्यों नहीं है?




floating-point language-agnostic (4)

इस प्रश्न का उत्तर यहां दिया गया है:

प्रासंगिक आईईईई मानक एक संख्यात्मक निरंतर NaN परिभाषित करता है (संख्या नहीं) और यह निर्धारित करता है कि NaN को तुलनात्मक रूप से तुलनात्मक रूप से तुलना नहीं करनी चाहिए। ऐसा क्यों है?

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

आईईईई मानकों को अच्छी तरह से सोचा जाता है, इसलिए मुझे यकीन है कि एक अच्छा कारण है कि नाइन की तुलना में नाइन की तुलना में बुरा क्यों होगा। मैं बस यह नहीं समझ सकता कि यह क्या है।


इसे इस्तेमाल करे:

var a = 'asdf';
var b = null;

var intA = parseInt(a);
var intB = parseInt(b);

console.log(intA); //logs NaN
console.log(intB); //logs NaN
console.log(intA==intB);// logs false

यदि intA == intB सत्य थे, तो यह आपको निष्कर्ष निकालने के लिए प्रेरित कर सकता है कि एक == बी, जो यह स्पष्ट रूप से नहीं है।

इसे देखने का एक और तरीका यह है कि नाएन सिर्फ आपको कुछ जानकारी नहीं देता है, न कि यह क्या है। उदाहरण के लिए, यदि मैं कहता हूं कि 'एक सेब गोरिला नहीं है' और 'एक नारंगी गोरिल्ला नहीं है', तो क्या आप निष्कर्ष निकालेंगे कि 'एक सेब' == 'एक नारंगी' है?


एक अच्छी संपत्ति है: यदि x == x झूठी वापसी करता है, तो x NaN.

(कोई यह जांचने के लिए इस संपत्ति का उपयोग कर सकता है कि x NaN या नहीं।)


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

अस्वीकरण: मैं अपने गणित अध्ययन के दौरान केवल कुछ रोचक चेतावनी की अस्पष्ट यादों के साथ काम कर रहा हूं। मैं क्षमा चाहता हूं अगर मैंने उपरोक्त उल्लिखित अवधारणाओं का प्रतिनिधित्व करने का एक कष्टप्रद काम किया है।

यदि आप यह मानना ​​चाहते हैं कि NaN एक अकेला मूल्य है, तो आप शायद कुछ परिणामों से नाखुश होने जा रहे हैं जैसे समानता ऑपरेटर जिस तरह से आप चाहते हैं / काम नहीं कर रहे हैं। हालांकि, अगर आप यह मानना ​​चुनते हैं कि नाएन एक अकेले प्लेसहोल्डर द्वारा प्रतिनिधित्व की जाने वाली "बुरेपन" की निरंतरता है, तो आप समानता ऑपरेटर के व्यवहार से पूरी तरह से खुश हैं। दूसरे शब्दों में, आप समुद्र में पकड़े गए मछली की दृष्टि खो देते हैं, लेकिन आप एक और को पकड़ते हैं जो दिखता है लेकिन वह बदबूदार है।


मेरा मूल उत्तर (4 साल पहले) निर्णय के बारे में समझने के बिना आधुनिक दिन के परिप्रेक्ष्य से निर्णय की आलोचना करता है जिसमें निर्णय लिया गया था। इस प्रकार, यह सवाल का जवाब नहीं देता है।

सही उत्तर here दिया गया here :

NaN ! = NaN दो व्यावहारिक विचारों से उत्पन्न हुआ:

[...] उस समय कोई isnan( ) अनुमान लगाया गया था जब उस समय 8087 अंकगणित में isnan( ) को औपचारिक रूप दिया गया था; प्रोग्रामर को NaN मानों का पता लगाने के सुविधाजनक और कुशल माध्यमों के साथ प्रोग्रामर प्रदान करना आवश्यक था जो प्रोग्रामिंग भाषाओं पर निर्भर नहीं थे जैसे कि isnan( ) जो कई सालों तक ले सकता है

उस दृष्टिकोण के लिए एक नुकसान था: यह संख्यात्मक गणना से संबंधित कई परिस्थितियों में NaN कम उपयोगी बना दिया। उदाहरण के लिए, बहुत बाद में जब लोग लापता मूल्यों का प्रतिनिधित्व करने के लिए NaN का उपयोग करना चाहते थे और उन्हें हैश-आधारित कंटेनर में डाल दिया, तो वे ऐसा नहीं कर सके।

यदि समिति ने भविष्य के उपयोग के मामलों को पूर्ववत किया, और उन्हें काफी महत्वपूर्ण माना, तो वे अधिक verbose के लिए चले गए थे !(x<x & x>x) x!=x बजाय NaN परीक्षण के रूप में। हालांकि, उनका ध्यान अधिक व्यावहारिक और संकीर्ण था: संख्यात्मक गणना के लिए सबसे अच्छा समाधान प्रदान करना, और इस तरह उन्होंने अपने दृष्टिकोण के साथ कोई समस्या नहीं देखी।

===

मूल उत्तर:

मुझे खेद है, क्योंकि मैं इस विचार की सराहना करता हूं कि शीर्ष वोट वाले उत्तर में गया, मैं इससे असहमत हूं। NaN का मतलब "अपरिभाषित" नहीं है - देखें http://www.cs.berkeley.edu/~wkahan/ieee754status/IEEE754.PDF , पृष्ठ 7 (शब्द "अपरिभाषित" शब्द खोजें)। जैसा कि दस्तावेज़ पुष्टि करता है, NaN एक अच्छी तरह से परिभाषित अवधारणा है।

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

नतीजतन, मेरा निष्कर्ष इस प्रकार है।

आईईईई समिति के सदस्यों ने इसे बहुत स्पष्ट रूप से नहीं सोचा, और गलती की। चूंकि बहुत कम लोग आईईईई समिति के दृष्टिकोण को समझते हैं, या इस बारे में परवाह करते हैं कि मानक एनएएन के बारे में क्या कहता है (बुद्धिमान: नाइन के अधिकांश कंपाइलर्स उपचार आईईईई मानक का उल्लंघन करते हैं), किसी ने भी अलार्म नहीं उठाया। इसलिए, यह गलती अब मानक में एम्बेडेड है। यह तय करने की संभावना नहीं है, क्योंकि इस तरह का एक फिक्स बहुत सारे मौजूदा कोड को तोड़ देगा।

संपादित करें: यहां एक बहुत ही जानकारीपूर्ण चर्चा से एक पोस्ट है। नोट: निष्पक्ष दृश्य प्राप्त करने के लिए आपको पूरे धागे को पढ़ना होगा, क्योंकि गिडो कुछ अन्य मूल डेवलपर्स के लिए एक अलग दृश्य लेता है। हालांकि, Guido इस विषय में व्यक्तिगत रूप से रुचि नहीं है, और बड़े पैमाने पर टिम पीटर्स सिफारिश का पालन करता है। अगर किसी के पास नाइन के पक्ष में टिम पीटर्स के तर्क हैं NaN != NaN , कृपया उन्हें टिप्पणियों में जोड़ें; उनके पास मेरी राय बदलने का अच्छा मौका है।





ieee-754