자바 NaN

프로그래밍을 하던 도중 변수 하나의 값이 자꾸 튀는 경우가 발생했습니다. 변수는 float으로 선언 된 변수였는데, 문제가 무엇인지 값을 출력하면서 실행을 하다보니 NaN 이라는 값이 출력이 되었습니다.

public Vector2D unit() {
    float tmp;
    try {
        tmp = 1 / this.getLength();
    }
    catch(ArithmeticException e) {
        return new Vector2D(0.0f, 0.0f); // 0으로 나눴을 때 리턴값
    }
    return this.multiply(tmp);
}

위의 코드가 NaN이라는 특수 값이 출력되었던 코드입니다. 분명히 위에서 보이는 것과 같이 정수를 0으로 나누는 것을 대비해 ArithmeticException으로 처리를 하였지만 찾아보니, 실수에서의 연산에서 0으로 나누는 경우 무한대를 의미하는 NaN 값이 할당되게 됩니다. 때문에 실수인 경우 0으로 나누는 것을 나누기 위해선 예외처리가 아니라 if문을 사용한 처리를 해야합니다.

public Vector2D unit() {
    float tmp;

    if((tmp = this.hetLength()) == 0)
        return new Vector2D(0.0f, 0.0f); // 0으로 나눴을 때 리턴값

    return this.multiply(1/tmp);
}

위처럼 코드를 작성하여 실수에서 0으로 나눴을 때 할당되는 NaN 값을 피할 수 있습니다.