CodeGym /جاوا بلاگ /Random-SD /جاوا ۾ NaN
John Squirrels
سطح
San Francisco

جاوا ۾ NaN

گروپ ۾ شايع ٿيل
جاوا ۾، "NaN" لاء بيٺل آهي "نمبر نه". اهو هڪ قسم جو استثنا نه آهي، بلڪه حيرت انگيز طور تي، NaN جو ڊيٽا ٽائپ پڻ هڪ نمبر آهي. پر اڪثر جڏهن نوان پروگرامرز ان کي اڻڄاڻ طور تي حاصل ڪندا آهن، اهي ان کي پنهنجي حساب ۾ استعمال ڪندا آهن. انهيء ڪري، جاوا ۾ غير مطابقت واري ڊيٽا جا قسم جڏهن گڏ استعمال ڪيا ويندا آهن هڪ اڇلائي غلطي سبب ٿي سگهي ٿي. اهو پڻ عام طور تي ڏٺو ويو آهي ته java.lang.ArithmeticException: / by zeroاهو ساڳيو سمجهيو ويندو آهي 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
مٿي ڏنل تصوير ۾، توهان ڏسي سگهو ٿا ته NaN 3 سادي عملن جي نتيجي ۾ پيدا ٿيو آهي:
  • صفر کي صفر سان ورهائڻ float / double.
  • هڪ منفي نمبر جي روٽ هيٺ آڻڻ (Math.sqrt(-x)). رياضي ۾، هڪ منفي عدد جي چورس روٽ کي هڪ خيالي انگ ۾ نتيجو آهي . اهو ڪيس جاوا ۾ NaN واپس ڪرڻ سان ڊيل ڪيو ويو آهي.
  • صفر سان عدد جو موڊ وٺڻ، قدر کي صفر سان ورهائڻ کان پوءِ باقي واپس ڏيندو. انهيء ڪري، NaN واپسي آهي.

ڪيئن NaN مثبت ۽ منفي لاتعداد کان مختلف آهي؟

IEEE 754 وضاحتن جي مطابق، حدن جي ڪيسن کي سنڀالڻ لاء ٽي خاص سچل-پوائنٽ ۽ ٻٽي قدر آهن:
  • مثبت لاتعداد
  • منفي لاتعداد
  • نان
هڪ مثبت انگ کي 0 سان ورهائڻ جو نتيجو مثبت لامحدود آهي. اهڙي طرح، منفي لامحدود پيداوار جي نتيجي ۾ هڪ منفي عدد کي صفر سان ورهائڻ جي نتيجي ۾. مهرباني ڪري نوٽ ڪريو ته سڀئي سچل نقطي قدر لاڳو ٿين ٿا ڊيٽا جي قسم جي ڊبل تي پڻ. فلوٽ جي محدود سڌائي ڪڏهن ڪڏهن ڪافي نه هوندي آهي. بهرحال، اسان ڏسندا سين ته ڪيئن NaN ٻنهي فلوٽ ۽ ڊبل لاء ڪم ڪري ٿو بعد ۾ سيڪشن ۾.

NaNaN () طريقو ڇا آهي؟

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 به شامل آهي غلط موٽائي ٿو. Java مهيا ڪري ٿو Float.NaN ۽ Double.NaN مسلسل شعبن لاءِ ٻنهي طبقن ۾ مقابلو ڪرڻ لاءِ. اسان انهن کي ٻن الڳ الڳ حالتن ۾ مختلف ڪري سگهون ٿا:
  • صحيح: صرف برابري جي صورت ۾ (!=)
  • غلط: سڀني مقابلي واري ڪمن لاءِ (==، <=، >=، <، >)
هتي توهان لاء ڪم ڪندڙ مثال آهي:
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