Ing Jawa, "NaN" tegese "Not a Number". Iku dudu jinis pangecualian, nanging nggumunake, jinis data NaN uga minangka nomer. Nanging asring nalika programer anyar ora sengaja, dheweke luwih nggunakake ing petungan. Mula, jinis data sing ora cocog ing Jawa nalika digunakake bebarengan bisa nyebabake kesalahan sing bisa dibuang. Iku uga umum katon sing
Contone, deleng cuplikan ing ngisor iki.
java.lang.ArithmeticException: / by zero
dianggep padha karo NaN. Nanging, Jawa dianggep beda. Cukup bingung? Kanggo pangerten sing lengkap, kita bakal mbedakake kepiye bedane. Ing pungkasan artikel iki, sampeyan bakal sinau babagan kemungkinan operasi sing ora ngasilake nomer (nan), lan sawetara cara sing gampang kanggo nangani.
Apa NaN?
Dadi, apa NaN? "NaN" minangka akeh sing wis guessed, digunakake kanggo makili "Ora Nomer" ing Jawa. Iki minangka nilai floating point khusus kanggo nuduhake overflows lan kesalahan. Iki digawe nalika nomer floating point dipérang nol utawa yen akar kuadrat saka nomer negatif diitung.
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
}
}
Output
NaN
NaN
NaN
Ing cuplikan ing ndhuwur, sampeyan bisa mirsani yen NaN diprodhuksi minangka asil saka 3 operasi prasaja:
- Dibagi
float / double
nol karo nol. - Njupuk under-root saka nomer negatif (Math.sqrt(-x)). Ing matématika, njupuk akar kuadrat saka nomer negatif ngasilake nomer imajiner . Kasus iki ditangani kanthi mbalekake NaN ing basa Jawa.
- Njupuk mod saka nomer karo nul, bakal bali seko sawise dibagi Nilai dening nul. Dadi, NaN bali.
Kepiye NaN Beda karo Infinity Positif lan Negatif?
Miturut spesifikasi IEEE 754, ana telung nilai floating-point & dobel khusus kanggo nangani kasus wates:- Positif tanpa wates
- Negatif tanpa wates
- NaN
Apa Metode NaN()?
isNaN()
iku salah siji saka cara dhasar ing Jawa kanggo mriksa apa iku nilai NaN utawa ora. Nalika kita rembugan telung kasus ndhuwur, iku wektu kanggo nyoba carane isNaN () cara mbedakake antarane + infinity , -infinity lan nilai 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());
}
}
Output
+Infinity.IsNaN() = false
-Infinity.IsNaN() = false
NaN.IsNaN() = true
Kepiye Mbandhingake Nilai NaN?
Saben nilai NaN dianggep béda. Iki tegese, ora ana siji NaN sing padha karo NaN liyane. Miturut asas iki, Yen mbandhingaké siji nilai liyane asil tansah negatif. Wiwit, NaN unordered, supaya comparison numerik nglibatno malah siji NaN bali palsu. Jawa nyedhiyakake Float.NaN lan Double.NaN kanggo lapangan pancet ing loro kelas kanggo nindakake bandingaken. Kita bisa mbedakake iki ing rong skenario sing kapisah:- Bener: Mung ing kasus In-equality (!=)
- Palsu: Kanggo kabeh operan perbandingan (==, <=, >=, <, >)
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
}
}
Kepiye Cara Nggawe Nilai NaN?
Sadurunge mbungkus, ayo goleki sawetara conto umum kanggo entuk Ora Nomer (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));
}
}
Output:
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