मैं कैसे NaN करने के लिए एक नाव की तुलना कर सकते NaN की तुलना हमेशा अवास्तविक लौटाते तो क्या होगा?

वोट
34

मैं NaN (घड़ी खिड़की में देखा) के लिए सेट एक नाव मूल्य है, लेकिन मैं समझ नहीं पता लगाने के लिए कैसे है कि कोड में:

if (fValue == float.NaN) // returns false even though fValue is NaN
{
}
12/03/2009 को 15:55
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


5 जवाब

वोट
73

आप चाहते हैं float.IsNaN(...)। तुलना करने के लिए NaNहमेशा अवास्तविक लौटाते, कोई बात नहीं क्या नाव का मूल्य है। यह चल अंकों की विचित्रता से एक है।

इसका मतलब है कि आप यह कर सकते हैं:

if (f1 != f1) { // This conditional will be true if f1 is NaN.

वास्तव में, कि वास्तव में कैसे IsNaN () काम करता है।

12/03/2009 को 15:56
का स्रोत उपयोगकर्ता

वोट
29

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

if (float.IsNaN(fValue))
{
}
12/03/2009 को 15:56
का स्रोत उपयोगकर्ता

वोट
12

प्रदर्शन के लिए महत्वपूर्ण कोड में float.IsNaNबहुत धीमी गति से हो सकता है, क्योंकि यह एफपीयू शामिल है। उस मामले में आप द्विआधारी मुखौटा चेक (के अनुसार उपयोग कर सकते हैं आईईईई 754 विनिर्देश पालन):

public static unsafe bool IsNaN (float f)
{
    int binary = *(int*)(&f);
    return ((binary & 0x7F800000) == 0x7F800000) && ((binary & 0x007FFFFF) != 0);
}

यह 5 बार की तुलना में तेजी है float.IsNaN। मैं सिर्फ आश्चर्य है कि क्यों माइक्रोसॉफ्ट को लागू नहीं किया था IsNaNइस तरह से। आप असुरक्षित कोड का उपयोग नहीं करना चाहते तो आप अभी भी संघ की तरह संरचना का उपयोग कर सकते हैं:

[StructLayout (LayoutKind.Explicit)]
struct FloatUnion
{
    [FieldOffset (0)]
    public float value;

    [FieldOffset (0)]
    public int binary;
}

public static bool IsNaN (float f)
{
    FloatUnion union = new FloatUnion ();
    union.value = f;

    return ((union.binary & 0x7F800000) == 0x7F800000) && ((union.binary & 0x007FFFFF) != 0);
}

यह अभी भी 3 गुना से अधिक तेज़ है IsNaN

20/02/2012 को 11:56
का स्रोत उपयोगकर्ता

वोट
7
if(float.isNaN(fValue))
{
}
12/03/2009 को 15:57
का स्रोत उपयोगकर्ता

वोट
2
if (fValue.CompareTo(float.NaN) == 0)

नोट: मैं जानता हूँ कि, धागा मर चुका है।

27/03/2011 को 04:38
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more