জাভাতে, "NaN" এর অর্থ হল "Not a Number"। এটি একটি ব্যতিক্রম নয়, বরং আশ্চর্যজনকভাবে, NaN এর ডেটাটাইপও একটি সংখ্যা। কিন্তু প্রায়শই যখন নবীন প্রোগ্রামাররা এটি অনিচ্ছাকৃতভাবে পেয়ে যায়, তারা তাদের গণনায় এটি ব্যবহার করে। সুতরাং, জাভাতে বেমানান ডেটা টাইপ যখন একসাথে ব্যবহার করা হয় তখন একটি নিক্ষেপযোগ্য ত্রুটি হতে পারে। এটি সাধারণত দেখা যায় যেটিকে
উদাহরণস্বরূপ, নিম্নলিখিত স্নিপেটটি দেখুন।
java.lang.ArithmeticException: / by zero
NaN এর মতোই বিবেচনা করা হয়। যাইহোক, জাভা তাদের উভয়কে ভিন্নভাবে ব্যবহার করে। যথেষ্ট বিভ্রান্তিকর? আপনার বিস্তৃত বোঝার জন্য আমরা এইগুলি একে অপরের থেকে কীভাবে আলাদা তা বিচ্ছিন্ন করব। এই নিবন্ধের শেষে আপনি সম্ভাব্য ক্রিয়াকলাপগুলি সম্পর্কে শিখবেন যা একটি সংখ্যা নয় (nan) এবং এটি পরিচালনা করার কিছু সহজ উপায় সম্পর্কে।
NaN কি?
তাই, NaN কি? "NaN" যেমন আপনারা অনেকেই অনুমান করেছেন, জাভাতে "নম্বর নয়" উপস্থাপন করতে ব্যবহৃত হয়। ওভারফ্লো এবং ত্রুটিগুলি বোঝাতে এটি একটি বিশেষ ফ্লোটিং পয়েন্ট মান। এটি উৎপন্ন হয় যখন একটি ভাসমান বিন্দু সংখ্যাকে শূন্য দ্বারা ভাগ করা হয় বা যদি একটি ঋণাত্মক সংখ্যার বর্গমূল গণনা করা হয়।
public class NaN
{
public static void main(String[]args)
{
System.out.println(0.0 / 0.0); //zero divided by zero
System.out.println(Math.sqrt(-1)); //take sqrt of negative number
System.out.println(10.0 % 0); //taking mod by zero
}
}
আউটপুট
NaN
NaN
NaN
উপরের স্নিপেটে, আপনি লক্ষ্য করতে পারেন যে 3টি সহজ অপারেশনের ফলে NaN তৈরি হয়েছে:
- একটি
float / double
শূন্যকে শূন্য দিয়ে ভাগ করা। - একটি ঋণাত্মক সংখ্যা (Math.sqrt(-x)) এর আন্ডার-রুট নেওয়া। গণিতে, একটি ঋণাত্মক সংখ্যার বর্গমূল গ্রহণ করলে একটি কাল্পনিক সংখ্যা হয় । এই কেসটি জাভাতে NaN ফেরত দিয়ে মোকাবেলা করা হয়।
- শূন্য সহ একটি সংখ্যার মোড নিলে, একটি মানকে শূন্য দিয়ে ভাগ করার পরে অবশিষ্টটি ফেরত দেবে। তাই, NaN ফেরত দেওয়া হয়।
কিভাবে NaN ইতিবাচক এবং নেতিবাচক অসীম থেকে আলাদা?
IEEE 754 স্পেসিফিকেশন অনুসারে, সীমানা কেস পরিচালনা করার জন্য তিনটি বিশেষ ফ্লোটিং-পয়েন্ট এবং ডবল মান রয়েছে:- ইতিবাচক অসীমতা
- নেতিবাচক অসীমতা
- NaN
NaN() পদ্ধতি কি?
isNaN()
এটি একটি NaN মান কিনা তা পরীক্ষা করার জন্য জাভাতে একটি মৌলিক পদ্ধতি। যেমনটি আমরা উপরে তিনটি ক্ষেত্রে আলোচনা করেছি, এটি পরীক্ষা করার সময় এসেছে কিভাবে isNaN() পদ্ধতি +infinity , -infinity এবং NaN মানের মধ্যে পার্থক্য করে।
public class isNaN
{ public static void main(String[]args)
{
Double posInfinity = +2.0 / 0.0;
Double negInfinity = -3.5 / 0.0;
Double nanVal = 50 % 0.0;
System.out.println ("+" + posInfinity + ".IsNaN() = " + posInfinity.isNaN());
System.out.println ( negInfinity + ".IsNaN() = " + negInfinity.isNaN());
System.out.println ( nanVal + ".IsNaN() = " + nanVal.isNaN());
}
}
আউটপুট
+Infinity.IsNaN() = false
-Infinity.IsNaN() = false
NaN.IsNaN() = true
কিভাবে NaN মান তুলনা করবেন?
প্রতিটি NaN মান স্বতন্ত্র হিসাবে বিবেচিত হয়। এর মানে হল, একটি NaN অন্য কোন NaN এর সমান নয়। এই নীতি অনুসারে, আপনি যদি একটি মান অন্যের সাথে তুলনা করেন তবে ফলাফল সর্বদা নেতিবাচক হয়। যেহেতু, NaN অপরিবর্তিত, তাই একটি সংখ্যাসূচক তুলনা যেখানে এমনকি একটি একক NaN যুক্ত থাকে তা মিথ্যা দেখায়। জাভা তুলনা করার জন্য উভয় শ্রেণীর ধ্রুবক ক্ষেত্রের জন্য Float.NaN এবং Double.NaN প্রদান করে। আমরা দুটি পৃথক পরিস্থিতিতে এগুলিকে আলাদা করতে পারি:- সত্য: শুধুমাত্র সমতার ক্ষেত্রে (!=)
- False: সমস্ত তুলনামূলক অপারেন্ডের জন্য (==, <=, >=, <, >)
public class ComparingNaN
{ public static void main(String[] args)
{
// Comparing NaN values for Float constants
System.out.println (Float.NaN != Float.NaN); // true
System.out.println (Float.NaN == Float.NaN); // false
System.out.println (Float.NaN < Float.NaN); // false
System.out.println (Float.NaN > Float.NaN); // false
System.out.println (Float.NaN <= Float.NaN); // false
System.out.println (Float.NaN >= Float.NaN); // false
// Comparing NaN values for Float constants
System.out.println (Double.NaN != Double.NaN); // true
System.out.println (Double.NaN == Double.NaN); // false
System.out.println (Double.NaN < Double.NaN); // false
System.out.println (Double.NaN > Double.NaN); // false
System.out.println (Double.NaN <= Double.NaN); // false
System.out.println (Double.NaN >= Double.NaN); // false
}
}
কিভাবে NaN মান তৈরি করবেন?
মোড়ানোর আগে, আসুন একটি নট এ নম্বর (ন্যান) পাওয়ার কিছু সাধারণ উদাহরণ দেখি।
public class GenerateNaNValues {
static final float ZERO = 0;
public static void main (String[]args)
{
System.out.println("ZERO / ZERO = " + (ZERO / ZERO));
System.out.println("+INFINITY - INFINITY = " +
(Float.POSITIVE_INFINITY + Float.NEGATIVE_INFINITY));
System.out.println("-INFINITY * ZERO = " + (Float.NEGATIVE_INFINITY * ZERO));
System.out.println("+INFINITY * ZERO = " + (Float.POSITIVE_INFINITY * ZERO));
System.out.println("log10(-10) = " + Math.log(-10));
System.out.println("√-10 = " + Math.sqrt(-10));
System.out.println("NaN + 10 = " + (Float.NaN + 10));
System.out.println("NaN - 10 = " + (Float.NaN - 10));
System.out.println("NaN * 10 = " + (Float.NaN * 10));
System.out.println("NaN / 10 = " + (Float.NaN / 10));
System.out.println("NaN + NaN = " + (Float.NaN + Float.NaN));
System.out.println("NaN - NaN = " + (Float.NaN - Float.NaN));
System.out.println("NaN * NaN = " + (Float.NaN * Float.NaN));
System.out.println("NaN / NaN = " + (Float.NaN / Float.NaN));
}
}
আউটপুট:
ZERO / ZERO = NaN
+INFINITY - INFINITY = NaN
-INFINITY * ZERO = NaN
+INFINITY * ZERO = NaN
log10(-10) = NaN
√-10 = NaN
NaN + 10 = NaN
NaN - 10 = NaN
NaN * 10 = NaN
NaN / 10 = NaN
NaN + NaN = NaN
NaN - NaN = NaN
NaN * NaN = NaN
NaN / NaN = NaN
GO TO FULL VERSION