2013-01-05 108 views
8

संभव डुप्लिकेट:
NaN Literal in C?एएनएसआई सी में NaN मान को परिभाषित करने के लिए कैसे?

मैं एएनएसआई सी जो पैरामीटर के रूप में दो नंबर प्राप्त करता है में एक समारोह लिख रहा हूँ। पैरामीटर int या float प्रकार के हैं। संख्या मेरे फ़िल्टर के अनुसार वैध हो सकती है या नहीं भी हो सकती है। मैं कुछ मूल्य अर्थ विफलता कैसे वापस करूँ? वापसी का प्रकार float है। मेरे दिमाग में आने वाली पहली चीज़ NaN अमूर्त प्रकार थी। लेकिन मैं कैसे एएनएसआई सी में यह प्रतिनिधित्व करने के लिए

पता नहीं है (मेरा बुरा अंग्रेजी के लिए खेद। अंग्रेजी मेरी मूल भाषा नहीं है)

+0

@ ओली क्रिसल्सवर्थ: लेकिन यह सी 99 – Jack

+0

उत्तर में से एक उत्तर '0.0/0.0' सुझाया गया है। –

+1

कोई बिल्कुल पोर्टेबल तरीका नहीं है, NaN C89 में मौजूद नहीं है और सी 99 से अनिवार्य नहीं है। – effeffe

उत्तर

12

NaN एक "सार प्रकार" नहीं है। यह एक फ्लोटिंग पॉइंट डेटम का मूल्य है।

"एएनएसआई सी 'से आप मानक सी (जो अवधि के वास्तविक अर्थ के रूप में ज्यादा के रूप में यह एक है, में), इसका मतलब यह तो एक का पता लगाने के <math.h> और प्रयोग NAN मैक्रो एक नेन निर्माण करने के लिए, और isnan(x) शामिल ।

"एएनएसआई सी 'से आप वास्तव में लंबे समय से प्रतिस्थापित C89 मानक (जो कुछ लोगों को करना चाहते हैं, भले ही वह औपचारिक रूप से सही नहीं है) का अर्थ हैं, तो आप 0./0. के साथ एक NaN मूल्य उत्पादन कर सकते हैं, और x != x के साथ एक के लिए जाँच ।

+0

आप अपने कोड में एक छोटा सा रैपर भी बना सकते हैं जो यह पता लगाता है कि कोड को C99 या उच्चतर के रूप में संकलित नहीं किया जा रहा है और फिर आपके उत्तर के लिए मैक्रोज़ 'एनएएन' और' इस्नान 'को परिभाषित करता है। – Will

+0

@ विल: निश्चित रूप से, हालांकि मुझे नहीं लगता कि '0./0।'औपचारिक रूप से 'एनएएन' मैक्रो की आवश्यकताओं को पूरा करता है (यानी यह स्थिर प्रारंभिकरण के लिए उपयोग योग्य होना चाहिए); अभी भी शायद अधिकांश उपयोगकर्ताओं के लिए चिंता नहीं है। –

+2

@StephenCanon '0।/0.' निरंतर अभिव्यक्ति है, इसलिए स्थिर प्रारंभिकरण के लिए यह ठीक है। – ouah

4

प्रश्न संख्या के अनुसार मान्य न हो मेरी

if (x != x) // x is NaN 

के रूप में ग में उल्लेख किया है: "इसके बजाय NaN के खिलाफ संख्या आप इस का उपयोग कर सकते की तुलना में फ़िल्टर कर तो मैं कैसे कुछ मूल्य अर्थ विफलता वापसी करते

? omments, आप C89 में float NaN मान का उत्पादन करने के लिए इस अभिव्यक्ति 0.f/0.f का उपयोग कर सकते हैं।

+0

ओपी ने नहीं पूछा कि नाएन की जांच कैसे करें। –

-2

इस

if(your_variable != your_variable) 
{ 
    return 0; //catch 0 as the failure returned value 
} 
else 
{ 
    //your code 
} 
+0

-1 क्योंकि यह उत्तर कुछ भी नहीं समझाता है, जबकि उस कोड को शामिल करना जो किसी भी व्यक्ति को बहुत भ्रमित नहीं करेगा, पहले से ही पता नहीं है कि NaN का उपयोग कैसे करें और इसे तुरंत स्थानांतरित करने में सक्षम है। इसके अलावा क्योंकि '0' पूरी तरह से उचित मूल्य वापसी हो सकता है। –

2

आप ऐसा नहीं कर सकते की तरह कुछ है, तो आप दो चर लौट आए, मूल्य के लिए एक, विफलता ध्वज के लिए एक की जरूरत है।

उदाहरण के लिए आप चीज सेट कर सकते हैं ताकि सामान्य ऑपरेशन के मामले में फ़ंक्शन सत्य लौटाएगा। असफलता (NaN) के मामले में झूठी

परिणाम संग्रहित करने वाला चर पैरामीटर के रूप में संदर्भ द्वारा पारित किया जाता है और सफलता के मामले में वापसी मूल्य रखेगा।

BOOL myFunction(int inInt, float inFloat, float *outResult) 
{ 
    /* 
     PROCESSING HERE 
    */ 

    // in case of failure 

    if(/* failure condition here */) 
    { 
     *outResult = 0; 
     return false; 
    } 

    *outResult = /* your result */ 

    return true; 
} 


// how to use the function 

int a; 
float b; 
float result; 
BOOL success; 

success = myFunction(a, b, &result); 

if(success) 
{ 
    // do whatever with your "result" 
} 
else 
{ 
    // NaN 
}