फ्लोटिंग-पॉइंट एक्सेप्शन तब होता है जब कोई सॉफ्टवेयर किसी संख्यात्मक संख्या पर अनुचित ऑपरेशन करने का प्रयास करता है। इस प्रकार का अपवाद तब होता है जब कोई उपयोगकर्ता अमान्य ऑपरेशन निष्पादित करने का प्रयास करता है, जैसे शून्य से विभाजन, एक सम संख्या द्वारा ऋणात्मक संख्या का विभाजन, ऋणात्मक संख्या का वर्गमूल लेना, या एक गणना का ओवरफ्लो जो डबल डेटा प्रकार की सीमा से अधिक हो।
C++ में, "SIGFPE" सिग्नल हैंडलर फ्लोटिंग पॉइंट एक्सेप्शन (FPEs) को संभालता है। जब कोई उपयोगकर्ता उल्लिखित कार्यों को करने का प्रयास करता है, तो यह सिग्नल हैंडलर कहा जाता है। एक बार सिग्नल हैंडलर द्वारा हस्तक्षेप करने के बाद, यह मानक आउटपुट पर एक त्रुटि संदेश प्रिंट करता है और प्रोग्राम को रोक देता है।
फ्लोटिंग-पॉइंट एक्सेप्शन क्यों होते हैं?
फ्लोटिंग पॉइंट एक्सेप्शन प्रोग्रामिंग त्रुटियों के कारण या जब कोई प्रोग्राम किसी ऐसे मान को संसाधित करने का प्रयास करता है जो विनिर्देश से बाहर है, हो सकते हैं। उदाहरण के लिए, यदि कोई प्रोग्राम किसी पूर्णांक को शून्य से विभाजित करने का प्रयास करता है, या यदि कोई प्रोग्राम ऋणात्मक संख्या का वर्गमूल लेने का प्रयास करता है, तो एक फ्लोटिंग पॉइंट एक्सेप्शन होगा। इसके अलावा, कुछ फ्लोटिंग-पॉइंट एक्सेप्शन प्रोसेसर मिसडिटेक्शन के कारण हो सकते हैं।
अनुचित ऑपरेशन, अंडरफ्लो, ओवरफ्लो, शून्य से विभाजन, और सटीकता जैसे कई कारक फ्लोटिंग-पॉइंट एक्सेप्शन का परिणाम हो सकते हैं। हम इस खंड में इन तर्कों को एक-एक करके कवर करेंगे।
1: अवैध ऑपरेशन
जब कोई उपयोगकर्ता किसी ऑपरेशन को व्यक्त करना भूल जाता है या ऑपरेशन का कोई गणितीय मूल्य नहीं होता है, तो प्रोग्राम अमान्य ऑपरेशन के कारण निष्पादित होने में विफल रहता है। इसमें ऋणात्मक संख्याओं के वर्गमूल और लघुगणक जैसी गणनाएं शामिल हैं, उदाहरण के लिए। हालांकि जटिल संख्याओं से निपटने पर ऋणात्मक संख्या का वर्गमूल लेना संभव है, लेकिन इसे व्यक्त करने के लिए कोई कंप्यूटर-आधारित तंत्र नहीं है।
इसके अलावा, यदि कोई सॉफ्टवेयर पूर्णांक-केवल स्थान पर फ्लोटिंग-पॉइंट ऑपरेशन निष्पादित करता है तो एक गलत ऑपरेशन होगा। यह आपके द्वारा डेटा पर किए जाने वाले ऑपरेशन (फ्लोटिंग-पॉइंट ऑपरेशन) और संग्रहीत डेटा (पूर्णांक) के बीच बेमेल के कारण है।
2: शून्य से विभाजन
यदि आप किसी पूर्णांक को शून्य से विभाजित करने का प्रयास करते हैं तो एक फ्लोटिंग-पॉइंट एक्सेप्शन थ्रो किया जाता है। वही चीज तब होती है जब आप NaN या अनंत से विभाजित करने का प्रयास करते हैं। यहां कुछ उदाहरण हैं: 1/0, log(0)।
3: ओवरफ्लो
जब कोई ऑपरेशन ऐसा मान लौटाता है जो इसकी अपेक्षित सीमा से बाहर होता है, तो एक ओवरफ्लो एक्सेप्शन होता है। इस कथन के अनुसार मान या तो सबसे छोटे प्रतिनिधित्व योग्य मान से अधिक या कम होता है।
4: अंडरफ्लो
अंडरफ्लो तब होता है जब कोई गणना ऐसा परिणाम देती है जो डेटा प्रकार धारण कर सकता है उससे कम होता है।
5: इनएक्जैक्ट
जब किसी ऑपरेशन का परिणाम अपेक्षा से भिन्न होता है, तो इसे इनएक्जैक्ट एक्सेप्शन के रूप में जाना जाता है। जब ऑपरेशन अनबाउंड सटीकता और एक्सपोनेंट रेंज के साथ किया जाता है तो यह होता है।
कुछ मामलों में, ऐसी स्थितियों को उचित तरीके से संभाला जा सकता है। उदाहरण के लिए, जब कोई प्रोग्राम किसी संख्या को शून्य से विभाजित करने का प्रयास करता है, तो आमतौर पर प्रोग्राम को क्रैश होने देने के बजाय एक त्रुटि संदेश लौटाना और प्रोग्राम को उचित तरीके से समाप्त करना बेहतर होता है।
#include <iostream>
#include <stdexcept>
using namespace std;
float Div(float num, float den)
{
if (den == 0) {
throw runtime_error("Math error: Attempted to divide by 0\n");
}
return (num / den);
}
int main()
{
float num, denom, result;
num = 10;
denom = 0;
try {
result = Div(num, denom);
cout << "The quotient is " << result << endl;
}
catch (runtime_error& e) {
cout << "Exception occurred" << endl << e.what();
}
}
इस कोड में, Div फ़ंक्शन को main के अंदर ट्राई ब्लॉक द्वारा बुलाया जाता है। यदि denom शून्य के बराबर नहीं है, तो Div फ़ंक्शन भागफल लौटाता है; यदि यह है, तो एक रनटाइम एरर एक्सेप्शन थ्रो किया जाता है। रनटाइम एरर ऑब्जेक्ट e के साथ what फ़ंक्शन को कॉल करने से पहले, कैच ब्लॉक इस एक्सेप्शन को इंटरसेप्ट करता है और टेक्स्ट "Error occurred" प्रिंट करता है। इसका उपयोग एक्सेप्शन की पहचान करने के लिए किया जाता है। stdexcept हेडर फ़ाइल में वर्णित Standard एक्सेप्शन क्लास में एक वर्चुअल फ़ंक्शन what() होता है। परिणामस्वरूप संदेश "Math error: Attempted to divide by 0" प्रिंट होता है।
आउटपुट
C++ में फ्लोटिंग पॉइंट एक्सेप्शन को रोकने के लिए, फ़ंक्शंस को पास किए गए सभी पैरामीटर्स की जांच करना, उपयुक्त फॉर्मेट का उपयोग करना, और शून्य मानों के लिए डिवाइसर्स को स्पष्ट रूप से टेस्ट करना आवश्यक है। इसके अलावा, डबल डेटा प्रकारों का उपयोग करते समय, यदि प्रोग्राम को बड़े अंकगणितीय परिणामों की आवश्यकता है तो डेटा प्रकार की सीमा को बढ़ाना महत्वपूर्ण है।
निष्कर्ष
C++ में फ्लोटिंग पॉइंट एक्सेप्शन संख्यात्मक मानों पर अमान्य ऑपरेशन के कारण होते हैं और प्रोग्राम की सही ढंग से निष्पादित होने की क्षमता को प्रभावित कर सकते हैं। ऐसी त्रुटियों से बचने के लिए, फ़ंक्शंस को पास किए गए सभी पैरामीटर्स की जांच करना और उपयुक्त डेटा प्रकारों का उपयोग करना महत्वपूर्ण है। इसके अलावा, फ्लोटिंग पॉइंट एक्सेप्शन को पकड़ना फायदेमंद है।