2008-10-25 18 views
7

SO (Using NaN in C++) पर एक और प्रश्न देखने के बाद मैं std::numeric_limits<double>::signaling_NaN() के बारे में उत्सुक हो गया।std :: signaling_nan का उपयोग कैसे करें?

मुझे अपवाद फेंकने के लिए signaling_NaN नहीं मिल सका। मैं संकेत यह वास्तव में एक संकेत का मतलब द्वारा शायद सोचा तो मैं SIGFPE पकड़ने लेकिन नहीं ...

यहाँ मेरी कोड है की कोशिश की:

double my_nan = numeric_limits<double>::signaling_NaN(); 
my_nan++; 
my_nan += 5; 
my_nan = my_nan/10; 
my_nan = 15/my_nan; 
cout << my_nan << endl; 

numeric_limits<double>::has_signaling_NaN सही का आकलन, तो यह अपने सिस्टम पर कार्यान्वित किया जाता है।

कोई विचार?

मैं एमएस विजुअल स्टूडियो .NET 2003 के सी ++ कंपाइलर का उपयोग कर रहा हूं। जब मैं घर जाता हूं तो मैं इसे किसी अन्य पर परीक्षण करना चाहता हूं।

धन्यवाद!

+0

मुझे लगता है कि my_nan और num एक ही चर होना चाहिए। यदि ऐसा है तो कृपया इसे ठीक करें। – Motti

उत्तर

5

आप फ्लोटिंग-पॉइंट अपवादों को सक्षम करने के लिए _control87() फ़ंक्शन का उपयोग कर सकते हैं। _control87() पर MSDN प्रलेखीकरण से:

नोट:

रन-टाइम पुस्तकालयों डिफ़ॉल्ट रूप से सभी फ्लोटिंग प्वाइंट अपवाद मुखौटा।

जब फ़्लोटिंग पॉइंट अपवाद सक्षम होते हैं, तो आप उन्हें पकड़ने के लिए signal() या SEH (Structured Exception Handling) का उपयोग कर सकते हैं।

0
TFM से

:

cout << "The signaling NaN for type float is: " 
    << numeric_limits<float>::signaling_NaN() 
    << endl; 

->

प्रकार नाव के लिए संकेत दे NaN है: 1. #

QNAN जहां 'क्यू' के लिए खड़ा है 'शांत' । डुनो क्यों यह वापस लौटाएगा, लेकिन यही कारण है कि यह आपके लिए अपवाद नहीं फेंकता है।

जिज्ञासा से, क्या यह बेहतर काम करता है?

const double &real_snan(void) 
{ 
    static const long long snan = 0x7ff0000080000001LL; 
    return *(double*)&snan; 
} 
1

कुंजी numeric_limits<T>::has_signaling_NaN में निहित है। यह आपके लिए कौन सा मूल्य है? (एमएसडीएन का सुझाव है कि एमएसवीसी के लिए यह हमेशा false है?)

5

चेतावनी का एक शब्द: तृतीय पक्ष डीएलएल का उपयोग करके इन अपवादों को चुपचाप सक्षम कर सकते हैं। डीएलएल को लोड करने के लिए यह विशेष रूप से सच है जो एक भाषा में लिखे गए हैं जो उन्हें डिफ़ॉल्ट रूप से सक्षम बनाता है।

मैंने दो उदाहरणों में ऐसा किया है: एक एम्बेडेड ब्राउज़र नियंत्रण से एचपी प्रिंटर पर प्रिंट करना, और डेल्फी में लिखे गए इनोसेटअप से मेरा डीएलएल (जो कुछ शुरुआती मूल्यों को NaN पर सेट करता है) को पंजीकृत करता है।

+1

बाहरी डीएलएल को कॉल करते समय मुझे विपरीत मामले पता है। तो उस बिंदु से सभी एफपीयू अपवादों पर मुखौटा लगाया जाता है। इसलिए मुझे प्रोग्राम में संभावित त्रुटियों के बारे में कोई जानकारी नहीं है। ऐसी खराब लिखित चीजें शर्म की बात है। सभी तीसरे पक्ष के डीएलएल को पिछले मूल्यों पर फ्लोटिंग पॉइंट अपवाद मास्क वापस करना चाहिए। – truthseeker