2013-08-26 10 views
14

मैं openjdk-1.7.0_25 स्रोत कोड देख रहा था और मैं इस विधि को देखा है:जावा isNan यह कैसे काम करता है?

/** 
* 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 argument is NaN; 
*   {@code false} otherwise. 
*/ 
static public boolean isNaN(float v) { 
    return (v != v); 
} 

मैं नहीं समझ सकता है कि यह कैसे काम करता है, जब इस विधि true लौट सकते हैं?

उत्तर

17

विधि निश्चित संचालनों के लिए सच लौट सकते हैं उदाहरण के लिए, यही कारण है कि:

System.out.println(Float.isNaN(0.0f/0.0f)); 
System.out.println(Double.isNaN(Math.sqrt(-1))); 

असल में, NaN एक अपरिभाषित मूल्य का प्रतिनिधित्व करता। 0.0/0.0 का मान NaN है, और Nan != NaN है। यह तार्किक प्रतीत हो सकता है क्योंकि Math.sqrt(-1) आपको NaN भी प्रदान करता है।

Double.NaN की जावाडोक देखें:

यह द्वारा Double.longBitsToDouble(0x7ff8000000000000L)

दिए गए मान के बराबर है और फिर Double.longBitsToDouble():

तो तर्क सीमा में किसी भी मूल्य है 0x7ff0000000000001L0x7fffffffffffffffL के माध्यम से या 0xfff0000000000001Lके माध्यम से, परिणाम NaN है। जावा द्वारा प्रदान किया गया कोई आईईईई 754 फ्लोटिंग-पॉइंट ऑपरेशन अलग-अलग बिट पैटर्न के साथ एक ही प्रकार के दो NaN मानों के बीच अंतर कर सकता है।

+0

तो ऑपरेशन का एक छोटा सा सेट 'NaN' वापस कर सकता है और केवल उन मानों के साथ यह' सत्य 'वापस कर सकता है ... ठीक है धन्यवाद! – rascio

+0

@rascio। हाँ वह विधि केवल 'NaN' तर्क के लिए' सत्य 'वापस कर देगी। और कुछ अन्य ऑपरेशन भी हो सकता है, जो 'NaN' देता है। 'डबल। POSITIVE_INFINITY/Double.POSITIVE_INFINITY' की तरह, नकारात्मक अनंतता के लिए। –

+0

@rascio इसके अलावा, यह न भूलें कि यदि आप उस 'NaN' मान के साथ गणना करते रहते हैं, तो हर परिणाम हमेशा' NaN' होता है। तो सैद्धांतिक रूप से हां, केवल संचालन का एक छोटा सा सेट वास्तव में 'NaN' उत्पन्न करता है, लेकिन यदि आप इसके साथ गणना करते रहते हैं, तो हर आगे का ऑपरेशन' NaN' भी वापस आ जाएगा! –

2

क्योंकि केवल NaN ही अपने साथ झूठी तुलना करता है। तो जब आप विधि में NaN पास करते हैं तो यह सच हो जाएगा।

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

Source

यह सिर्फ जावा के बारे में नहीं, यह भी IEEE754 मानक का पालन सभी भाषाओं के लिए सच है।

संबंधित प्रश्न: Why does Double.NaN==Double.NaN return false?

+1

.. क्या आप इसे प्रदर्शित कर सकते हैं? – sanbhat

+0

@sanbhat: मैंने कोड को अपडेट किया है। उम्मीद है कि अब यह समझ में आता है। – xyz

3

से Java Language Specification:

फ्लोटिंग सूत्री समानता परीक्षण आईईईई 754 मानक के नियमों के अनुसार किया जाता है:

  • या तो संकार्य NaN है, तो == का परिणाम झूठा है लेकिन इसका परिणाम! = सच है। दरअसल, परीक्षण x! = X सत्य है अगर केवल तभी एक्स का मान NaN है। (विधियों Float.isNaN और Double.isNaN का उपयोग यह जांचने के लिए भी किया जा सकता है कि कोई मान NaN है या नहीं।)

  • सकारात्मक शून्य और नकारात्मक शून्य बराबर माना जाता है। इसलिए, -0.0 == 0.0 सत्य है, उदाहरण के लिए।

  • अन्यथा, समानता ऑपरेटरों द्वारा दो अलग-अलग फ़्लोटिंग-पॉइंट मानों को असमान माना जाता है। विशेष रूप से, एक मूल्य सकारात्मक अनंतता का प्रतिनिधित्व करता है और एक मूल्य नकारात्मक अनंतता का प्रतिनिधित्व करता है; प्रत्येक तुलना केवल अपने आप के बराबर होती है, और प्रत्येक तुलना अन्य सभी मूल्यों के बराबर होती है।

0

जहाँ तक मुझे पता NaN value रूप anything.So जब आप float v पारित कर दिया, यह कभी नहीं इसे करने के लिए स्वयं बराबर नहीं है बराबर नहीं है।

1

सरल .. Nan हमेशा है! =NaN, ये मान किसी भी चीज़ के बराबर नहीं हैं। this देखें:!

पहले से ही वर्णित किया गया है के रूप में, NaN अव्यवस्थित है, इसलिए एक या दो Nans से जुड़े एक अंकीय तुलना आपरेशन झूठी वापस आती है और किसी भी = NaN को शामिल तुलना सच देता है, एक्स सहित = जब एक्स एक्स NaN है।

तो जांच करना है कि v != v बताने के लिए है कि क्या valueNaN है या नहीं पर्याप्त है।

संबंधित मुद्दे