मैं NaN (घड़ी खिड़की में देखा) के लिए सेट एक नाव मूल्य है, लेकिन मैं समझ नहीं पता लगाने के लिए कैसे है कि कोड में:यदि एनएएन की तुलना हमेशा झूठी वापसी करती है तो मैं फ्लोट की तुलना NaN से कैसे कर सकता हूं?
if (float.IsNaN(fValue))
{
}
मैं NaN (घड़ी खिड़की में देखा) के लिए सेट एक नाव मूल्य है, लेकिन मैं समझ नहीं पता लगाने के लिए कैसे है कि कोड में:यदि एनएएन की तुलना हमेशा झूठी वापसी करती है तो मैं फ्लोट की तुलना NaN से कैसे कर सकता हूं?
if (float.IsNaN(fValue))
{
}
आप:
if (fValue == float.NaN) // returns false even though fValue is NaN
{
}
इस प्रयास करें float.IsNaN(...)
चाहते हैं। NaN
की तुलना हमेशा झूठी वापसी करती है, भले ही फ्लोट का मूल्य क्या हो। यह तैरने वाले बिंदुओं के quirks में से एक है।
इसका मतलब है कि आप यह कर सकते हैं:
if (f1 != f1) { // This conditional will be true if f1 is NaN.
वास्तव में, कि वास्तव में कैसे IsNaN() काम करता है।
if(float.isNaN(fValue))
{
}
यह एक सी # प्रश्न है। सी # में 'फ्लोट' पर ऐसी कोई विधि नहीं है 'एनएनएन'; यह राजधानी "आई" के साथ 'इस्ना' है। –
if (fValue.CompareTo(float.NaN) == 0)
नोट: मुझे पता है, धागा मर चुका है।
प्रदर्शन-महत्वपूर्ण कोड 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 गुना तेजी से: आप असुरक्षित कोड का उपयोग नहीं करना चाहते तो आप अभी भी संघ की तरह संरचना का उपयोग कर सकते हैं।
"मुझे आश्चर्य है कि माइक्रोसॉफ्ट ने इस तरह से आईएसएनएएन को क्यों लागू नहीं किया।" क्योंकि वह कोड मंच-निर्भर है और कहीं और तोड़ देगा। –
आईईईई 754 में फ़्लोटिंग-पॉइंट डेटा स्ट्रक्चर का वर्णन किया गया है और प्लेटफ़ॉर्म-स्वतंत्र है। इसके अलावा, अनंत पर जांच बाइनरी तुलना के माध्यम से .NET में लागू की जाती है उदा। '((* (((int *) और f)) और 0x7fffffff) == 0x7f800000)'। –
फ़्लोटिंग-पॉइंट _डेटा संरचना_ प्लेटफ़ॉर्म-स्वतंत्र है, लेकिन अंतहीनता नहीं है। –
यह परेशान है :) – JaredPar
फिर NaN! = NaN? – alan2here
यह हैएनएएन() नहीं IsNaN() – AntonioCS