CodeGym /Java Blog /এলোমেলো /জাভাতে NaN
John Squirrels
লেভেল 41
San Francisco

জাভাতে NaN

এলোমেলো দলে প্রকাশিত
জাভাতে, "NaN" এর অর্থ হল "Not a Number"। এটি একটি ব্যতিক্রম নয়, বরং আশ্চর্যজনকভাবে, NaN এর ডেটাটাইপও একটি সংখ্যা। কিন্তু প্রায়শই যখন নবীন প্রোগ্রামাররা এটি অনিচ্ছাকৃতভাবে পেয়ে যায়, তারা তাদের গণনায় এটি ব্যবহার করে। সুতরাং, জাভাতে বেমানান ডেটা টাইপ যখন একসাথে ব্যবহার করা হয় তখন একটি নিক্ষেপযোগ্য ত্রুটি হতে পারে। এটি সাধারণত দেখা যায় যেটিকে java.lang.ArithmeticException: / by zeroNaN এর মতোই বিবেচনা করা হয়। যাইহোক, জাভা তাদের উভয়কে ভিন্নভাবে ব্যবহার করে। যথেষ্ট বিভ্রান্তিকর? আপনার বিস্তৃত বোঝার জন্য আমরা এইগুলি একে অপরের থেকে কীভাবে আলাদা তা বিচ্ছিন্ন করব। এই নিবন্ধের শেষে আপনি সম্ভাব্য ক্রিয়াকলাপগুলি সম্পর্কে শিখবেন যা একটি সংখ্যা নয় (nan) এবং এটি পরিচালনা করার কিছু সহজ উপায় সম্পর্কে।

NaN কি?

তাই, NaN কি? "NaN" যেমন আপনারা অনেকেই অনুমান করেছেন, জাভাতে "নম্বর নয়" উপস্থাপন করতে ব্যবহৃত হয়। ওভারফ্লো এবং ত্রুটিগুলি বোঝাতে এটি একটি বিশেষ ফ্লোটিং পয়েন্ট মান। এটি উৎপন্ন হয় যখন একটি ভাসমান বিন্দু সংখ্যাকে শূন্য দ্বারা ভাগ করা হয় বা যদি একটি ঋণাত্মক সংখ্যার বর্গমূল গণনা করা হয়। জাভাতে NaN - 1উদাহরণস্বরূপ, নিম্নলিখিত স্নিপেটটি দেখুন।

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
একটি ধনাত্মক সংখ্যাকে 0 দ্বারা ভাগ করার ফলাফল হল ধনাত্মক অসীমতা। একইভাবে, একটি ঋণাত্মক সংখ্যাকে শূন্য দিয়ে ভাগ করার ফলে ঋণাত্মক অসীমতা পাওয়া যায়। অনুগ্রহ করে মনে রাখবেন যে সমস্ত ফ্লোটিং পয়েন্ট মান ডাটা টাইপ ডাবলের ক্ষেত্রেও প্রযোজ্য। ফ্লোটের সীমিত নির্ভুলতা মাঝে মাঝে যথেষ্ট নয়। যাইহোক, আমরা পরবর্তী বিভাগে ফ্লোট এবং ডাবল উভয়ের জন্য কীভাবে 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

উপসংহার

NaN উৎপাদনকারী অসংখ্য অপারেশন দেখার পর, আপনি এখন এটির সাথে পরিচিত হতে হবে। এটি আপনাকে প্রাথমিকভাবে ধাঁধায় ফেলতে পারে, তবে এটির সাথে মোকাবিলা করা জটিল কিছু নেই। ডাবল/ফ্লোটিং পয়েন্ট ক্যালকুলেশনে একটি মান NaN নয় কিনা তা পরীক্ষা করার সামান্য অভ্যাস গড়ে তোলার মাধ্যমে আপনাকে অনেক ঝামেলা থেকে বাঁচাতে পারে। এমনকি যদি আপনি এটি প্রাথমিকভাবে ভুলে যান তবে এটি সম্পূর্ণ ঠিক আছে। ছোটখাটো সমস্যা সমাধানের জন্য আপনি সর্বদা এই নিবন্ধটি দেখতে পারেন। একযোগে সংকলনযোগ্য, ত্রুটি-মুক্ত কোড তৈরি করা বছরের অভিজ্ঞতার পরে আসে। সুতরাং আসুন কোডে আমাদের হাত নোংরা করি, এবং দুর্দান্ত কিছু তৈরি করি!
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION