Float/Double형의 값을 다룰 때 주의할 점 (NaN)

아래 코드를 실행하면 콘솔에는 NaN이 출력된다.

double x = 0.0;
double y = 0.0;
double num = x/y;
System.out.println(num); // NaN 출력

이렇게 연산 결과가 NaN(Not-a-Number)이 되는 경우에 대해서는 별도의 처리를 해주어야 한다. 그렇다면 그 값이 Double.NaN과 같은지 비교하면 될까?

System.out.println(num == Double.NaN);

위 코드는 false를 출력한다.

그런데 아래 코드는 true를 출력한다.

System.out.println(num.equals(Double.NaN));

사실 어떤 값이 NaN인지를 확인하는 올바른 방법은 아래와 같이 isNaN 메서드를 사용하는 것이다.

Double.isNaN(num);

한가지 재미있는 것은 isNaN 메서드의 소스코드이다.

static public boolean isNaN(double v) {
    return (v != v);
}

자기 자신과 다른지를 비교하고 있으니 항상 false를 리턴할 것 같지만 v가 NaN이면 true를 리턴하게 된다.

이렇게 처리되는 이유는 Java 문서와 IEEE 754와 관련된 자료를 찾아보면 알 수 있다.

간단히 요약하자면 잘못된 연산을 처리하기 위한 값들(positive infinity, negative infinity, not-a-number 등)이 할당되어있고, 이 값들을 비교하는 별도의 메서드가 제공된다.

Leave a Comment

Your email address will not be published. Required fields are marked *