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