2009-03-12 11 views
33

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

if (float.IsNaN(fValue)) 
{ 
} 

उत्तर

72

आप:

if (fValue == float.NaN) // returns false even though fValue is NaN 
{ 
} 
+36

यह परेशान है :) – JaredPar

+3

फिर NaN! = NaN? – alan2here

+0

यह हैएनएएन() नहीं IsNaN() – AntonioCS

29

इस प्रयास करें float.IsNaN(...) चाहते हैं। NaN की तुलना हमेशा झूठी वापसी करती है, भले ही फ्लोट का मूल्य क्या हो। यह तैरने वाले बिंदुओं के quirks में से एक है।

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

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

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

7
if(float.isNaN(fValue)) 
{ 
} 
+0

यह एक सी # प्रश्न है। सी # में 'फ्लोट' पर ऐसी कोई विधि नहीं है 'एनएनएन'; यह राजधानी "आई" के साथ 'इस्ना' है। –

2
if (fValue.CompareTo(float.NaN) == 0) 

नोट: मुझे पता है, धागा मर चुका है।

12

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

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

यह 5 बार float.IsNaN से तेज है। मुझे आश्चर्य है कि क्यों माइक्रोसॉफ्ट ने 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 गुना तेजी से: आप असुरक्षित कोड का उपयोग नहीं करना चाहते तो आप अभी भी संघ की तरह संरचना का उपयोग कर सकते हैं।

+1

"मुझे आश्चर्य है कि माइक्रोसॉफ्ट ने इस तरह से आईएसएनएएन को क्यों लागू नहीं किया।" क्योंकि वह कोड मंच-निर्भर है और कहीं और तोड़ देगा। –

+1

आईईईई 754 में फ़्लोटिंग-पॉइंट डेटा स्ट्रक्चर का वर्णन किया गया है और प्लेटफ़ॉर्म-स्वतंत्र है। इसके अलावा, अनंत पर जांच बाइनरी तुलना के माध्यम से .NET में लागू की जाती है उदा। '((* (((int *) और f)) और 0x7fffffff) == 0x7f800000)'। –

+2

फ़्लोटिंग-पॉइंट _डेटा संरचना_ प्लेटफ़ॉर्म-स्वतंत्र है, लेकिन अंतहीनता नहीं है। –

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