2009-07-17 14 views
77

क्या कोई मुझे यह समझा सकता है? सी # double.NaN में double.NaNडबल क्यों है। एनएएन स्वयं के बराबर नहीं है?

bool huh = double.NaN == double.NaN; // huh = false 
bool huh2 = double.NaN >= 0; // huh2 = false 
bool huh3 = double.NaN <= 0; // huh3 = false 

क्या लगातार मैं एक double.NaN से तुलना और सच प्राप्त कर सकते हैं के बराबर नहीं है?

+11

बस अपने हुहों को समझाने के लिए: NaN कुछ भी बराबर नहीं है, यहां तक ​​कि खुद भी नहीं। यह परिभाषा के अनुसार है। http://en.wikipedia.org/wiki/NaN – Falaina

+2

मुझे लगता है कि दुर्भाग्यपूर्ण है कि संदर्भ खो गया है। यदि हमारे पास दो युगल थे, और वास्तविक मूल्य 1/0 का प्रतिनिधित्व करने के लिए दोनों को NaN का मान सौंपा गया था। वे बराबर होना चाहिए, लेकिन चूंकि संदर्भ खो गया है, इसलिए उन्हें –

+0

के बराबर नहीं माना जाता है, आप सही हैं, उस विशेष मामले के लिए कोड की एक अतिरिक्त पंक्ति लागू की जानी चाहिए। – Carlo

उत्तर

127

आप उत्सुक हैं, तो यह क्या Double.IsNaN की तरह लग रहा है?

+4

बहुत मज़ाकिया! जब आप इसके बारे में सोचते हैं तो भी बहुत चालाक। –

+0

दिलचस्प। मुझे लगता है कि के बारे में पता नहीं था। समझ में आता है, एक बार जब आप इसे देखते हैं, NaN की परिभाषा के कारण ... – Noldorin

+10

यह अजीब है। लेकिन फिर, फिर भी NaN की घोषणा है: 'सार्वजनिक कॉन्स डबल NaN = (डबल) 1.0/(डबल) 0.0; ' –

15
bool isNaN = Double.IsNaN(yourNumber) 
6

इस के लिए एक विशेष समारोह है:

double.IsNan(huh); 
5

उपयोग विधि "Double.IsNaN (मान)" इस हालत के लिए जाँच करने के लिए।

7

समानता के परीक्षण के लिए Double.IsNan() का उपयोग करें। कारण यह है कि NaN एक संख्या नहीं है।

9

व्यवहार उद्देश्य पर है। NaN का कारण कुछ ऐसा दर्शाता है जो कोई संख्या नहीं है और इसलिए यह कई चीजों के लिए कैच-सब प्रकार है।

NaN होने के लिए कुछ की तुलना करने का उचित तरीका IsNaN फ़ंक्शन का उपयोग करना है। ,

public static bool IsNaN(double d) 
{ 
    return (d != d); 
} 

फंकी हुह:

3

असल में, आप पहले से ही है, तो एक आईईईई-754 चल बिन्दु संख्या NaN है की जाँच करने के रास्ता मिल गया: यह केवल चल बिन्दु मान (या मानों की श्रेणी, कई देखते हैं क्योंकि NANS) की तुलना में अगर False का आकलन करती है कि स्वयं, यानी:

bool isNaN(double v) { 
    return v != v; 
} 

हुड के तहत, Double.IsNaN विधि वास्तव में वही काम कर सकती है। आपको अभी भी इसका उपयोग करना चाहिए, क्योंकि व्यवहार किसी ऐसे व्यक्ति के लिए आश्चर्यजनक है जो एफपी मानक के बारे में नहीं जानता है।

2

एकमात्र चीज जो हम NaN के बारे में जानते हैं वह यह है कि यह "संख्या नहीं है।" इसका मतलब यह नहीं है कि इसका एक मूल्य है जो इसके राज्य के साथ मिलनसार है। उदाहरण के लिए:

∞ + (- ∞) = NaN

0/0 = NaN

(∞ + (- ∞)) <> (0/0)

यहाँ कुछ सी # प्रदर्शित करने के लिए

var infinity = 100d/0; 
var negInfinity = -100d/0; 

var notANumber = infinity + negInfinity; 
Console.WriteLine("Negative Infinity plus Infinity is NaN: {0}", double.IsNaN(notANumber)); 

var notANumber2 = 0d/0d; 
Console.WriteLine("Zero divided by Zero is NaN: {0}", double.IsNaN(notANumber2)); 

Console.WriteLine("These two are not equal: {0}", notANumber == notANumber2); 
+0

100/0 NaN नहीं है, यह अनंत है! http://docs.sun.com/source/806-3568/ncg_goldberg.html#918 –

+0

आप सही हैं। मैं संशोधन कर रहा हूँ। –

2

Double.NaN != Double.NaN का कारण है सरल:

क्या आप 0/0Math.Sqrt(-3) के समान होने की उम्मीद करते हैं? और Math.Sqrt(-7) के समान ही?

मेरी राय में सी # में एक बग है जहां Equals() NaN के लिए ओवरराइड नहीं है।

Assert.IsTrue(Double.NaN != Double.NaN); 
Assert.IsTrue(Double.NaN.Equals(Double.NaN)); 

एक ही समय में

Assert.IsTrue(Double.PositiveInfinity == Double.NegativeInfinity); 
Assert.IsTrue(Double.PositiveInfinity.Equals(Double.PositiveInfinity)); 
// same for Double.NegativeInfinity and Single 

उपयोग Double और Single, उदा के लिए स्थिर कार्यों

Double.IsNaN(value) && Double.IsInfinity(value); 

या अधिक विशिष्ट:

Double.IsPositiveInfinity(value); 
Double.IsNegativeInfinity(value); 
2

समानता ऑपरेटर एक दूसरे के लिए असमान होने के लिए दो NaN मूल्यों को समझता है। सामान्य रूप से, डबल ऑपरेटरों का उपयोग अन्य डबल मानों के साथ Double.NaN की तुलना करने के लिए नहीं किया जा सकता है, हालांकि तुलना विधियों (जैसे और तुलना करें) कर सकते हैं। उदाहरण

msdn

class Program 
{ 
    static void Main(string[] args) 
    { 
     Double i = Double.NaN; 
     while (!i.Equals(i)) //this would be result in false 
     //while(i != i) // this would result in true. 
     { 
      Console.WriteLine("Hello"); 
     } 
    } 
} 

here से संदर्भित नीचे देखें उसी के लिए .net बेला है।

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