दिलचस्प पोस्ट
अजगर का इस्तेमाल करते हुए सीज़र के साइफर, थोड़ी मदद इस्तेमाल कर सकते हैं jQuery के एचटीएमएल विशेषता IE में काम नहीं कर रहा है php त्रुटि शामिल नहीं पथ खोजना Asp.net mvc के साथ हाइफ़िनेटेड एचटीएमएल गुण आप एक ब्राउज़र के संस्करण का कैसे पता लगा सकते हैं? math.random, केवल 0 पैदा कर रहा है? क्या सूची-समझ और कार्यात्मक कार्य "लूप के लिए" की तुलना में तेज़ हैं? बैच के सभी आदेशों में क्या मतलब है और क्या करते हैं? PUT या POST अनुरोध के कच्चे बॉडी तक पहुंच नई लाइन पर ताला खोलने के साथ एक्सकोड 4 क्या मैं एक परिवेश परिवर्तनों पर उपयोगकर्ता नाम बदल सकता हूँ? लॉगिंग, स्ट्रीमहाण्डलर और मानक स्ट्रीम अजगर में तैरने की आसान सुंदर प्रिंटिंग? एचटीएमएल में दशमलव अंक संरेखित करें कैसे जीडीबी और QEMU के साथ लिनक्स कर्नेल डीबग करें?

डबल क्यों होता है। एनएएन == डबल। एनएएन झूठी वापसी क्यों करता है?

मैं सिर्फ ओपीपीपी प्रश्नों का अध्ययन कर रहा था और मुझे यह अजीब कोड मिला:

public static void main(String a[]) { System.out.println(Double.NaN==Double.NaN); System.out.println(Double.NaN!=Double.NaN); } 

जब मैं कोड चला, मुझे मिल गया:

 false true 

आउटपुट false कैसे होते हैं जब हम दो चीजों की तुलना कर रहे हैं जो एक-दूसरे के समान दिखते हैं? NaN क्या करता है?

Solutions Collecting From Web of "डबल क्यों होता है। एनएएन == डबल। एनएएन झूठी वापसी क्यों करता है?"

NaN का अर्थ है "एक नंबर नहीं"

जावा भाषा विशिष्टता (जेएलएस) तीसरा संस्करण कहता है :

ओवरफ्लो एक हस्ताक्षर किए अनन्तता का उत्पादन करता है, जो एक ऑपरेशन जो एक अंडोराइज्ड मान या एक हस्ताक्षरित शून्य उत्पन्न करता है, और एक ऑपरेशन जिसमें कोई गणितीय निश्चित परिणाम नैन पैदा नहीं करता है। नारायणन के साथ सभी संख्यात्मक संचालन एक परिचालित के रूप में नैनो का उत्पादन करते हैं। जैसा कि पहले ही वर्णित किया गया है, नाओएन अनारोड किया गया है, इसलिए एक या दो NaNs से जुड़े एक संख्यात्मक तुलना ऑपरेशन false और किसी भी रिटर्न के साथ देता है != तुलना में NaN रिटर्न शामिल true , x!=x सहित x!=x जब x नाएन है

एनएएन परिभाषा के अनुसार है, जिसमें एनएएन सहित किसी भी संख्या के बराबर नहीं है। यह आईईईई 754 मानक का हिस्सा है और सीपीयू / एफपीयू द्वारा लागू किया गया है। यह कुछ ऐसा नहीं है कि जेवीएम को समर्थन देने के लिए कोई तर्क जोड़ना होगा।

http://en.wikipedia.org/wiki/NaN

एक एनएएन के साथ तुलना हमेशा एक अनारडेड परिणाम देता है, जो स्वयं के साथ तुलना करते हैं … समानता और असमानता की भविष्यवाणी गैर-सिग्नल होती है तो x = x लौटाए गए झूठे परीक्षण के लिए इस्तेमाल किया जा सकता है यदि एक्स शांत नाएन है

जावा सभी NaN को शांत NaN के रूप में मानता है

क्यों कि तर्क

Not a Number NaN Not a Number मतलब Not a Number संख्या क्या नहीं है? कुछ भी। आप एक तरफ और दूसरी तरफ कुछ भी हो सकते हैं, इसलिए कुछ भी गारंटी नहीं देता कि दोनों बराबर हैं। NaN की गणना Double.longBitsToDouble(0x7ff8000000000000L) साथ की Double.longBitsToDouble(0x7ff8000000000000L) और जैसा कि आप longBitsToDouble के प्रलेखन में देख सकते हैं:

यदि तर्क 0x7ff0000000000001L 0x7fffffffffffffffL या 0xfff0000000000001L के 0xffffffffffffffffL माध्यम से सीमा में कोई मूल्य है, तो परिणाम एक NaN

साथ ही, NaN अंदर NaN का तर्कसंगत व्यवहार किया गया है।


प्रलेखन

 /** * A constant holding a Not-a-Number (NaN) value of type * {@code double}. It is equivalent to the value returned by * {@code Double.longBitsToDouble(0x7ff8000000000000L)}. */ public static final double NaN = 0.0d / 0.0; 

वैसे, आपके कोड नमूने के रूप में NaN का परीक्षण किया गया है:

 /** * Returns {@code true} if the specified number is a * Not-a-Number (NaN) value, {@code false} otherwise. * * @param v the value to be tested. * @return {@code true} if the value of the argument is NaN; * {@code false} otherwise. */ static public boolean isNaN(double v) { return (v != v); } 

उपाय

आप क्या कर सकते हैं compare / compareTo :

Double.NaN को इस पद्धति द्वारा अपने समतुल्य और अन्य सभी double मानों ( Double.POSITIVE_INFINITY सहित) से बड़ा माना जाता है।

 Double.compare(Double.NaN, Double.NaN); Double.NaN.compareTo(Double.NaN); 

या, equals :

यदि this और argument दोनों Double.NaN प्रतिनिधित्व करते हैं, तो equals विधि true रिटर्न, भले ही Double.NaN==Double.NaNDouble.NaN==Double.NaN का मान false

 Double.NaN.equals(Double.NaN); 

डबल के लिए javadoc । एनएएन यह सब कहते हैं:

निरंतर एक नॉन-ए-नंबर (एनएएन) के प्रकार का double प्रकार है। यह Double.longBitsToDouble(0x7ff8000000000000L) द्वारा लौटाए गए मूल्य के बराबर है।

दिलचस्प बात यह है कि Double लिए स्रोत NaN परिभाषित करता है:

 public static final double NaN = 0.0d / 0.0; 

आपके द्वारा वर्णित विशेष व्यवहार को JVM में हार्ड-वायर्ड है।

यह सवाल का सीधा जवाब नहीं होगा। लेकिन अगर आप यह देखना चाहते हैं कि कुछ Double.NaN बराबर है। Double.NaN आपको इसका उपयोग करना चाहिए:

 double d = Double.NaN Double.isNaN(d); 

यह true वापस करेगा

नाएन एक विशेष मूल्य है जो "संख्या नहीं" को दर्शाता है; यह कुछ अमान्य गणित के संचालन का परिणाम है, जैसे कि sqrt(-1) , और (कभी कभी परेशान) संपत्ति है जो NaN != NaN

अनुसार, डबल प्रेसिजन नंबरों के लिए फ़्लोटिंग पॉइंट अंकगणित के लिए आईईईई मानक ,

आईईईई डबल परिशुद्धता फ़्लोटिंग बिंदु मानक प्रतिनिधित्व के लिए 64 बिट शब्द की आवश्यकता होती है, जिसे 0 से 63 तक गिने जाने के लिए बाएं से दाएं

यहां छवि विवरण दर्ज करें कहा पे,

 S: Sign – 1 bit E: Exponent – 11 bits F: Fraction – 52 bits 

यदि E=2047 (सभी E 1 ) और F नोजरोज़ा है, तो V=NaN ("संख्या नहीं")

जिसका मतलब है,

अगर सभी E बिट्स 1 हैं, और अगर F में कोई भी शून्य शून्य है तो संख्या में NaN

इसलिए, दूसरों के बीच, सभी निम्नलिखित संख्याएं NaN ,

 0 11111111 0000000000000000010000000000000000000000000000000000 = NaN 1 11111111 0000010000000000010001000000000000001000000000000000 = NaN 1 11111111 0000010000011000010001000000000000001000000000000000 = NaN 

विशेष रूप से, आप परीक्षण नहीं कर सकते

 if (x == Double.NaN) 

यह जांचने के लिए कि क्या एक विशेष परिणाम Double.NaN बराबर है, क्योंकि सभी "नंबर नहीं" मान अलग-अलग माना जाता है हालांकि, आप Double.isNaN विधि का उपयोग कर सकते हैं:

 if (Double.isNaN(x)) // check whether x is "not a number" 

कोई संख्या परिचालन के परिणाम का प्रतिनिधित्व नहीं करता है जिसका परिणाम किसी संख्या के साथ प्राप्य नहीं है। सबसे प्रसिद्ध ऑपरेशन 0/0 है, जिसका परिणाम ज्ञात नहीं है

इस कारण से, एनएएन कुछ के बराबर नहीं है (अन्य नॉन-ए-नंबर मानों सहित) अधिक जानकारी के लिए, बस विकिपीडिया पेज देखें: http://en.wikipedia.org/wiki/NaN