डबल क्यों है। NNN खुद के बराबर नहीं है?


82

क्या कोई मुझे ये समझा सकता है? C # 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

मैं किसी दोहरे की तुलना कैसे कर सकता हूं। एनएएन और सच पाने के लिए?


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

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

13
गणितीय रूप से सही है। कोई यह क्यों सोचेगा कि एक नैन दूसरे के बराबर होगा? sqrt (-1)! = 1/0
— गॉर्डन गुस्ताफसन

2
यह NULLएसक्यूएल की तरह है
— shashwat

2
@MichaelMeadows 1/0 Inf है, NaN नहीं।
— जिम बेल्टर

जवाबों:


133

यदि आप उत्सुक हैं, तो ऐसा Double.IsNaNदिखता है:

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

फंकी, हुह?


11
यह बिल्कुल अजीब है। लेकिन फिर से, इसलिए NaN की घोषणा की गई है:public const double NaN = (double) 1.0 / (double) 0.0;
— फ्रेड्रिक मोर्क

5
@Fredik, @Erich: Zero द्वारा डिवीजन inf (या, inf, -inf ऑपरेंड के आधार पर), 0/0 (अन्य के बीच) परिणाम एक NaN में देगा। वहाँ कम से विशेष अभियान / परिणाम के साथ एक अच्छा तालिका है steve.hollasch.net/cgindex/coding/ieeefloat.html
— टॉरस्टेन मारेक

5
भ्रम, ऑब्जेक्ट में जोड़ने के लिए। इक्वल (डबल.नएएन, डबल। एनएएन) सही है
— रोमन

2
@JimBalter आप सही हैं कि मेरी टिप्पणी गलत थी: संदर्भ स्रोत वास्तव में संदर्भ स्रोत से public const double NaN = (double)0.0 / (double)0.0; लिंक कह रहा है । यह बात बताने के लिए धन्यवाद। दूसरे नोट पर: गलत होना और झूठ बोलना दो पूरी तरह से अलग-अलग बातें हैं
— फ्रेड्रिक मोर्क

1
निश्चित नहीं है कि यह सही था जब आपने इसे पोस्ट किया था, लेकिन IsNaN को आज अलग तरह से परिभाषित किया गया है।
— जो एवेंडा



10

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

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



6

इसके लिए एक विशेष कार्य है:

double.IsNan(huh);

5

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


3

वास्तव में, आपको पहले से ही यह जांचने का तरीका मिल गया है कि क्या IEEE-754 फ्लोटिंग पॉइंट नंबर NaN है : यह केवल फ्लोटिंग पॉइंट वैल्यू (या मानों की श्रेणी है, क्योंकि कई NaN हैं) जो Falseस्वयं की तुलना में मूल्यांकन करता है, अर्थात:

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

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


2

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

∞ + (-∞) = NaN

0/0 = NaN

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

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

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);

2

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

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

मेरी राय में C # में एक बग है जहां 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 तुलना करने के लिए इस्तेमाल नहीं किया जा सकता है, हालांकि तुलना तरीकों (जैसे बराबर और compareTo ) कर सकते हैं। नीचे दिए गए उदाहरण देखें

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");
        }
    }
}

यहाँ उसी के लिए .net फिडेल है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.