CodeGym /Java Blog /๋ฌด์ž‘์œ„์˜ /์ž๋ฐ”์˜ NaN
John Squirrels
๋ ˆ๋ฒจ 41
San Francisco

์ž๋ฐ”์˜ NaN

๋ฌด์ž‘์œ„์˜ ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
Java์—์„œ "NaN"์€ "Not a Number"๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์˜ˆ์™ธ ์œ ํ˜•์ด ์•„๋‹ˆ๋ผ ์˜คํžˆ๋ ค ๋†€๋ž๊ฒŒ๋„ NaN์˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•๋„ ์ˆซ์ž์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ข…์ข… ์ดˆ๋ณด ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์˜๋„ํ•˜์ง€ ์•Š๊ฒŒ ๊ทธ๊ฒƒ์„ ์–ป์—ˆ์„ ๋•Œ ๊ทธ๋“ค์€ ๊ทธ๊ฒƒ์„ ๊ณ„์‚ฐ์— ๋” ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Java์—์„œ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด throw ๊ฐ€๋Šฅํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. java.lang.ArithmeticException: / by zero๋˜ํ•œ ์ผ๋ฐ˜์ ์œผ๋กœ NaN๊ณผ ๋™์ผํ•˜๊ฒŒ ๊ฐ„์ฃผ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ๊ทธ๋Ÿฌ๋‚˜ Java๋Š” ๋‘˜ ๋‹ค ๋‹ค๋ฅด๊ฒŒ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ์ถฉ๋ถ„ํžˆ ์ˆ˜์ˆ˜๊ป˜๋ผ? ํฌ๊ด„์ ์ธ ์ดํ•ด๋ฅผ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ํ•ญ๋ชฉ์ด ์„œ๋กœ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ๋ถ„์„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ์˜ ๋์—์„œ ์ˆซ์ž๊ฐ€ ์•„๋‹Œ(nan)์„ ์ƒ์„ฑํ•˜๋Š” ๊ฐ€๋Šฅํ•œ ์ž‘์—…๊ณผ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์‰ฌ์šด ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

NaN์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ทธ๋ ‡๋‹ค๋ฉด NaN์€ ๋ฌด์—‡์ผ๊นŒ์š”? ๋งŽ์€ ๋ถ„๋“ค์ด ์ง์ž‘ํ•˜์…จ๊ฒ ์ง€๋งŒ "NaN"์€ Java์—์„œ "Not a Number"๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ค๋ฒ„ํ”Œ๋กœ ๋ฐ ์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํŠน์ˆ˜ ๋ถ€๋™ ์†Œ์ˆ˜์  ๊ฐ’์ž…๋‹ˆ๋‹ค. ๋ถ€๋™ ์†Œ์ˆ˜์  ์ˆซ์ž๋ฅผ 0์œผ๋กœ ๋‚˜๋ˆ„๊ฑฐ๋‚˜ ์Œ์ˆ˜์˜ ์ œ๊ณฑ๊ทผ์„ ๊ณ„์‚ฐํ•  ๋•Œ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. Java์˜ 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๊ฐ€์ง€ ๊ฐ„๋‹จํ•œ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • 0์„ 0์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ float / double.
  • ์Œ์ˆ˜์˜ ๊ทผ์„ ์ทจํ•ฉ๋‹ˆ๋‹ค(Math.sqrt(-x)). ์ˆ˜ํ•™์—์„œ ์Œ์ˆ˜ ์˜ ์ œ๊ณฑ๊ทผ์„ ์ทจํ•˜๋ฉด ํ—ˆ์ˆ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค . ์ด ๊ฒฝ์šฐ๋Š” Java์—์„œ NaN์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
  • 0์œผ๋กœ ์ˆซ์ž์˜ mod๋ฅผ ์ทจํ•˜๋ฉด ๊ฐ’์„ 0์œผ๋กœ ๋‚˜๋ˆˆ ํ›„ ๋‚˜๋จธ์ง€๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ NaN์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

NaN์€ ์–‘์ˆ˜ ๋ฐ ์Œ์ˆ˜ ๋ฌดํ•œ๋Œ€์™€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€์š”?

IEEE 754 ์‚ฌ์–‘์— ๋”ฐ๋ฅด๋ฉด ๊ฒฝ๊ณ„ ์‚ฌ๋ก€๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์„ธ ๊ฐ€์ง€ ํŠน์ˆ˜ ๋ถ€๋™ ์†Œ์ˆ˜์  ๋ฐ ์ด์ค‘ ๊ฐ’์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์–‘์˜ ๋ฌดํ•œ๋Œ€
  • ์Œ์˜ ๋ฌดํ•œ๋Œ€
  • NaN
์–‘์ˆ˜๋ฅผ 0์œผ๋กœ ๋‚˜๋ˆˆ ๊ฒฐ๊ณผ๋Š” ์–‘์˜ ๋ฌดํ•œ๋Œ€์ž…๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์Œ์˜ ๋ฌดํ•œ๋Œ€๋Š” ์Œ์ˆ˜๋ฅผ 0์œผ๋กœ ๋‚˜๋ˆˆ ๊ฒฐ๊ณผ๋กœ ์‚ฐ์ถœ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ถ€๋™ ์†Œ์ˆ˜์  ๊ฐ’์€ double ๋ฐ์ดํ„ฐ ์œ ํ˜•์—๋„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ€๋™ ์†Œ์ˆ˜์ ์˜ ์ œํ•œ๋œ ์ •๋ฐ€๋„๋Š” ๋•Œ๋•Œ๋กœ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ดํ›„ ์„น์…˜์—์„œ NaN์ด float ๋ฐ double ๋ชจ๋‘์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

isNaN() ๋ฉ”์„œ๋“œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

isNaN()NaN ๊ฐ’์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” Java์˜ ๊ธฐ๋ณธ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์œ„์—์„œ ์„ธ ๊ฐ€์ง€ ์‚ฌ๋ก€๋ฅผ ๋…ผ์˜ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ 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๊ณผ ๊ด€๋ จ๋œ ์ˆซ์ž ๋น„๊ต๋Š” false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Java๋Š” ๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ํด๋ž˜์Šค์˜ ์ƒ์ˆ˜ ํ•„๋“œ์— ๋Œ€ํ•ด Float.NaN ๋ฐ Double.NaN์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ๊ฐœ๋ณ„ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ด๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • True: ๋™๋“ฑํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋งŒ(!=)
  • 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 ๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•?

๋งˆ๋ฌด๋ฆฌํ•˜๊ธฐ ์ „์— Not a Number(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์— ์ต์ˆ™ํ•ด์กŒ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ๋‹นํ™ฉ์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ๋ณต์žกํ•œ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ด์ค‘/๋ถ€๋™ ์†Œ์ˆ˜์  ๊ณ„์‚ฐ์—์„œ ๊ฐ’์ด NaN์ด ์•„๋‹Œ์ง€ ํ™•์ธํ•˜๋Š” ์ž‘์€ ์Šต๊ด€์„ ๊ธฐ๋ฅด๋ฉด ๋งŽ์€ ๋ฒˆ๊ฑฐ๋กœ์›€์—์„œ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์— ์ด๊ฒƒ์„ ์žŠ๋”๋ผ๋„ ์™„์ „ํžˆ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์‚ฌ์†Œํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ๋Œ€ํ•ด์„œ๋Š” ์–ธ์ œ๋“ ์ง€ ์ด ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ๊ฐ€๋Šฅํ•˜๊ณ  ์˜ค๋ฅ˜ ์—†๋Š” ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ์— ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ˆ˜๋…„๊ฐ„์˜ ๊ฒฝํ—˜์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์ด์ œ ์†์„ ๋”๋Ÿฝํ˜€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋ฉ‹์ง„ ๊ฒƒ์„ ๋งŒ๋“ค์–ด ๋ด…์‹œ๋‹ค!
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION