2013-08-08 11 views
50

मैंने फ़्लोटिंग पॉइंट के बारे में पढ़ा है और मैं समझता हूं कि NaN संचालन से परिणाम प्राप्त कर सकता है। लेकिन मैं समझ नहीं पा रहा हूं कि ये अवधारणाएं वास्तव में क्या हैं। क्या अंतर है?शांत NaN और NaN सिग्नलिंग के बीच क्या अंतर है?

सी ++ प्रोग्रामिंग के दौरान कौन सा उत्पादित किया जा सकता है? एक प्रोग्रामर के रूप में, क्या मैं एक प्रोग्राम लिख सकता हूं जो एक एसएनएएन का कारण बनता है?

उत्तर

37

जब एक ऑपरेशन एक शांत NaN में परिणाम होता है, तो कोई संकेत नहीं है कि कार्यक्रम तब तक असामान्य है जब तक प्रोग्राम नतीजे जांचता है और NaN देखता है। यही है, अगर फ्लोटिंग पॉइंट यूनिट (एफपीयू) या लाइब्रेरी से सॉफ़्टवेयर में फ्लोटिंग-पॉइंट लागू किया गया है तो गणना के बिना गणना जारी है। एक संकेतक NaN आमतौर पर एफपीयू से अपवाद के रूप में एक संकेत उत्पन्न करेगा। क्या अपवाद फेंक दिया गया है एफपीयू की स्थिति पर निर्भर करता है।

सी ++ 11 कुछ भाषा controls over the floating-point environment जोड़ता है और standardized ways to create and test for NaNs प्रदान करता है। हालांकि, क्या नियंत्रण लागू किए गए हैं, यह अच्छी तरह से मानकीकृत नहीं है और फ्लोटिंग-पॉइंट अपवाद आमतौर पर मानक सी ++ अपवादों के समान नहीं पकड़े जाते हैं।

पॉज़िक्स/यूनिक्स सिस्टम में, फ्लोटिंग पॉइंट अपवाद आमतौर पर SIGFPE के लिए हैंडलर का उपयोग करके पकड़े जाते हैं।

+20

इसमें जोड़ना: आम तौर पर, एक संकेतक NaN (sNaN) का उद्देश्य डीबगिंग के लिए है। उदाहरण के लिए, फ़्लोटिंग-पॉइंट ऑब्जेक्ट्स को एसएनएएन में शुरू किया जा सकता है। फिर, यदि प्रोग्राम उनमें से किसी एक को इसका उपयोग करने से पहले एक मान में विफल रहता है, तो एक अपवाद तब होगा जब प्रोग्राम अंकगणितीय ऑपरेशन में एसएनएएन का उपयोग करता है। एक कार्यक्रम अनजाने में एक एसएनएएन का उत्पादन नहीं करेगा; कोई सामान्य संचालन एसएनएएन का उत्पादन नहीं करता है। वे केवल विशेष रूप से एक संकेतक NaN होने के उद्देश्य से बनाए जाते हैं, न कि किसी अंकगणित के परिणाम के रूप में। –

+8

इसके विपरीत, NaNs अधिक सामान्य प्रोग्रामिंग के लिए हैं। जब कोई संख्यात्मक परिणाम नहीं होता है तो उन्हें सामान्य परिचालनों द्वारा उत्पादित किया जा सकता है (उदाहरण के लिए, परिणाम वास्तविक होने पर ऋणात्मक संख्या के वर्ग रूट को लेना)। उनका उद्देश्य आमतौर पर अंकगणित को सामान्य रूप से आगे बढ़ने की अनुमति देना होता है। उदाहरण के लिए, आपके पास संख्याओं की एक बड़ी श्रृंखला हो सकती है, जिनमें से कुछ विशेष मामलों का प्रतिनिधित्व करते हैं जिन्हें सामान्य रूप से संभाला नहीं जा सकता है। आप इस सरणी को संसाधित करने के लिए एक जटिल फ़ंक्शन को कॉल कर सकते हैं, और यह नाइन को अनदेखा कर, सामान्य अंकगणितीय के साथ सरणी पर काम कर सकता है। इसके समाप्त होने के बाद, आप विशेष मामलों को और अधिक काम के लिए अलग कर देंगे। –

+0

@wrdieter धन्यवाद, तो केवल मामूली अंतर निष्पादन उत्पन्न कर रहा है या नहीं। – JalalJaberi

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