NaN의 개념 및 사용방법, 대처법 + Infinity

Benjamin·2023년 2월 9일
0

JAVA

목록 보기
17/28

NaN

  • Not a Number
  • 한마디로 숫자가 아니라서 숫자로 표현을 할 수 없는 상태 (숫자이지만, 컴퓨터로 표현할 수 없는 숫자값도 포함)
  • 자기자신과 일치하지 않는 유일한 값!

NaN의 예시

0 / 0 -> ??
"String" * 1000 -> ???
Math.sqrt(-9) -> 음수의 제곱근은 허수! 허수는 표현불가이므로

int num = 0/0;
if(num == NaN) num = 0;

위의 코드가 실행될 것 같지만, 실제로는 동작하지않는다.

이유는? NaN는 자기자신과도 일치하지않기 때문이다!

그럼 NaN은 어떻게 확인할까?

NaN 체크(Check) 방법

소수점을 처리하는 변수들은 NaN을 체크하는 방법이 존재합니다.

double a = 0.0f / 0.0f;
System.out.println(a + "->" + Double.isNaN(a));

// NaN->true

double의 경우 Double 객체로 값을 check할 수 있고, float의 경우 Float으로 값을 체크할 수 있습니다.
각각 isNaN이라는 메소드를 제공하고 있기 때문에, 문제없이 체크를 할 수 있는 것이죠.
이는 true false로 반환합니다.

또한 이 함수는 인자로 받은값이 숫자가 아니거나 NaN이면 true로 값을 반환한다.

NaN 대처법

NaN 체크를 했으니, NaN에 대해서 대처를 해야 겠습니다.
예를 들어 NaN이 발생하는 경우, 0의 값으로 변경을 하는 것이겠죠.
대부분 NaN이 발생하는 이유가 0의 값을 처리하는 경우 발생을 하기 때문이죠.

double a = (Double.isNaN(0.0f / 0.0f)) ? 0.0 : 0.0f / 0.0f;
System.out.println(a);

위와 같이 값을 세팅할 때, 삼항 연산자를 써서 값을 세팅을 하든, NaN을 체크해서 0의 값을 세팅을 하는 방식으로 NaN 값에 대해서 대처를 할 수 있습니다.

NaN은 왜 자기자신과 비교가 불가한가?

예를 들어 생각해보자.
sqrt(-1) sqrt(-2)는 다른 결과이다 .
즉 같은 NaN이라고해도 값이 다를 수 있기때문이라 생각하면된다.


Infinity

  • 부동소수점숫자의 한계를 넘어가는 숫자를 말한다.

0/0 -> NaN
10/0 -> Infinity

public class TemplateA {
		public static void main(String[] args)  {
			
			double n = 10;
			
			System.out.println(n / 0.0);
			System.out.println(n % 0.0);
		}
    }

실수 값을 0 으로 나눈 몫의 값은 무한히 나누어질 수 있어 Colsole 창에 값이 Infinity 가 출력된 것을 확인할 수 있으며, 0으로 나눈 나머지의 값은 존재하지 않을뿐더러 숫자가 아니기 때문에, NaN이 출력된 것을 확인할 수 있다.

Infinity 체크(Check) 방법

  • Double.isInfinite(x)

Infinity, NaN 값이 나오지 않도록 체크를 해줄 수 있는 코드가 필요하게 될 수 있다.

이러한 체크코드가 필요한 이유는 계산식 초기에 Infinity 혹은 NaN의 값이 나왔다면,

어떠한 산술연산을 수행해도 이 두 가지 값에서 변하지 않기 때문이다.


참고
https://needneo.tistory.com/238
https://seeminglyjs.tistory.com/152

0개의 댓글