ফ্লোটিং-পয়েন্ট এক্সেপশন ঘটে যখন একটি সফটওয়্যার একটি সংখ্যাসূচক মান ওপর একটি অনুচিত অপারেশন সম্পাদন করার চেষ্টা করে। এই ধরনের এক্সেপশন ঘটে যখন একজন ব্যবহারকারী অবৈধ অপারেশন চালানোর চেষ্টা করে, যেমন শূন্য দিয়ে ভাগ করা, একটি নেতিবাচক সংখ্যাকে একটি জোড় সংখ্যা দিয়ে ভাগ করা, একটি নেতিবাচক সংখ্যার বর্গমূল নেওয়া, অথবা একটি গণনার ওভারফ্লো যেটি ডাবল ডেটা টাইপের সীমা অতিক্রম করে।
C++-এ, “SIGFPE” সিগন্যাল হ্যান্ডলার ফ্লোটিং পয়েন্ট এক্সেপশন (FPEs) হ্যান্ডেল করে। যখন একজন ব্যবহারকারী উপরে উল্লিখিত কাজগুলো চালানোর চেষ্টা করে, তখন এই সিগন্যাল হ্যান্ডলার ডাকা হয়। একবার সিগন্যাল হ্যান্ডলার হস্তক্ষেপ করলে, এটি স্ট্যান্ডার্ড আউটপুটে একটি এরর মেসেজ প্রিন্ট করে এবং প্রোগ্রামটি থামিয়ে দেয়।
ফ্লোটিং-পয়েন্ট এক্সেপশন কেন ঘটে?
ফ্লোটিং পয়েন্ট এক্সেপশন প্রোগ্রামিং ভুলের কারণে বা যখন একটি প্রোগ্রাম স্পেসিফিকেশনের বাইরের একটি মান প্রসেস করার চেষ্টা করে তখন ঘটতে পারে। উদাহরণস্বরূপ, যদি একটি প্রোগ্রাম একটি ইন্টিজারকে শূন্য দিয়ে ভাগ করার চেষ্টা করে, অথবা যদি একটি প্রোগ্রাম একটি নেতিবাচক সংখ্যার বর্গমূল নেওয়ার চেষ্টা করে, তবে একটি ফ্লোটিং পয়েন্ট এক্সেপশন ঘটবে। এর علاৱে, কিছু ফ্লোটিং-পয়েন্ট এক্সেপশন প্রসেসর মিসডিটেকশনের কারণে ঘটতে পারে।
অনুচিত অপারেশন, আন্ডারফ্লো, ওভারফ্লো, শূন্য দিয়ে ভাগ, এবং নির্ভুলতা - এমন অনেক фак্টর ফ্লোটিং-পয়েন্ট এক্সেপশন সৃষ্টি করতে পারে। আমরা এই আর্গুমেন্টগুলো একে একে এই সেকশনে আলোচনা করব।
১: অবৈধ অপারেশন (Illegal Operation)
যখন একজন ব্যবহারকারী একটি অপারেশন এক্সপ্রেস করতে ভুলে যায় বা অপারেশনটির কোনো গাণিতিক মান নেই, তখন প্রোগ্রামটি একটি অবৈধ অপারেশনের কারণে এক্সিকিউট হতে ব্যর্থ হয়। এতে নেতিবাচক সংখ্যার বর্গমূল এবং লগারিদম গণনা অন্তর্ভুক্ত। যদিও জটিল সংখ্যা নিয়ে কাজ করার সময় একটি নেতিবাচক সংখ্যার বর্গমূল নেওয়া সম্ভব, কিন্তু কম্পিউটার-ভিত্তিক কোনো মেকানিজম নেই এটি এক্সপ্রেস করার জন্য।
অতিরিক্তভাবে, যদি একটি সফটওয়্যার একটি ইন্টিজার-অনলি লোকেশনে একটি ফ্লোটিং-পয়েন্ট অপারেশন এক্সিকিউট করে, তবে একটি ভুল অপারেশন হবে। এর কারণ হলো আপনি যে অপারেশনটি ডেটা ওপর চালানোর চেষ্টা করছেন (ফ্লোটিং-পয়েন্ট অপারেশন) এবং সংরক্ষিত ডেটা (ইন্টিজার) এর মধ্যে একটি মিসম্যাচ।
২: শূন্য দিয়ে ভাগ (Zero Division)
আপনি যদি একটি ইন্টিজারকে শূন্য দিয়ে ভাগ করার চেষ্টা করেন, তবে একটি ফ্লোটিং-পয়েন্ট এক্সেপশন থ্রো হবে। একই জিনিস ঘটে যখন আপনি NaN বা ইনফিনিটি দিয়ে ভাগ করার চেষ্টা করেন। কিছু উদাহরণ: 1/0, log(0)।
৩: ওভারফ্লো (Overflow)
যখন একটি অপারেশন একটি মান রিটার্ন করে যা এর প্রত্যাশিত রেঞ্জের বাইরে, তখন একটি ওভারফ্লো এক্সেপশন ঘটে। মানটি হয় সবচেয়ে ছোট রিপ্রেজেন্টেবল ভ্যালু থেকে কম বা বেশি।
৪: আন্ডারফ্লো (Underflow)
আন্ডারফ্লো ঘটে যখন একটি গণনা এমন একটি ফলাফল দেয় যা একটি ডেটা টাইপ ধারণ করতে পারে তার চেয়ে কম।
৫: অনির্দিষ্ট (Inexact)
যখন একটি অপারেশনের ফলাফল প্রত্যাশিত থেকে ভিন্ন হয়, তখন এটি একটি ইনএ্যাক্ট এক্সেপশন হিসেবে জানা যায়। এটি ঘটে যখন অপারেশন অনবাউন্ড প্রিসিশন এবং এক্সপোনেন্ট রেঞ্জ দিয়ে সম্পাদিত হয়।
কিছু ক্ষেত্রে, এই পরিস্থিতিগুলো গ্রেসফুলি হ্যান্ডেল করা যায়। উদাহরণস্বরূপ, যখন একটি প্রোগ্রাম একটি সংখ্যাকে শূন্য দিয়ে ভাগ করার চেষ্টা করে, তবে সাধারণত প্রোগ্রামকে ক্র্যাশ হওয়া দেয়ার বদলে একটি এরর মেসেজ রিটার্ন করে গ্রেসফুলি প্রোগ্রাম টার্মিনেট করা ভালো।
#include
#include
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-এর ভিতরের try ব্লক দ্বারা কল করা হয়। যদি denom শূন্য না হয়, তবে Div ফাংশনটি কোশন্ট রিটার্ন করে; যদি হয়, তবে একটি রানটাইম এরর এক্সেপশন থ্রো করা হয়। catch ব্লক এই এক্সেপশন ইন্টারসেপ্ট করে এবং “Error occurred” টেক্সট প্রিন্ট করার আগে runtime_error অবজেক্ট e-র সাথে what ফাংশন কল করে। এটি এক্সেপশন আইডেন্টিফাই করার জন্য ব্যবহার করা হয়। stdexcept হেডার ফাইলে বর্ণিত Standard exception ক্লাসের একটি ভার্চুয়াল ফাংশন হলো what()। ফলস্বরূপ মেসেজ “Math error: Attempted to divide by 0” প্রিন্ট হয়।
আউটপুট

C++-এ ফ্লোটিং পয়েন্ট এক্সেপশন প্রতিরোধ করতে, ফাংশন들에 পাস করা সকল প্যারামিটার চেক করা, উপযুক্ত ফরম্যাট ব্যবহার করা, এবং ডিভাইজরকে স্পষ্টভাবে শূন্য মানের জন্য টেস্ট করা অপরিহার্য। এর পাশাপাশি, ডাবল ডেটা টাইপ ব্যবহার করার সময়, ডেটা টাইপের রেঞ্জ বড় করা গুরুত্বপূর্ণ যদি প্রোগ্রামটির জন্য বড় অ্যারিথমেটিক রেজাল্ট দরকার হয়।
উপসংহার
C++-এ ফ্লোটিং পয়েন্ট এক্সেপশন সংখ্যাসূচক মান ওপর অবৈধ অপারেশনের কারণে ঘটে এবং প্রোগ্রামের সঠিকভাবে এক্সিকিউট হওয়াকে প্রভাবিত করতে পারে। এই種 এরর এড়াতে, ফাংশন들에 পাস করা সকল প্যারামিটার চেক করা এবং উপযুক্ত ডেটা টাইপ ব্যবহার করা গুরুত্বপূর্ণ। এর পাশাপাশি, ফ্লোটিং পয়েন্ট এক্সেপশন ক্যাচ করা লাভদায়ক।