더북(TheBook)

031 double/float가 유한 부동소수점 값인지 검사

 

이 문제는 일부 부동소수점 메서드와 연산에서 예외를 던지는 대신 InfinityNaN으로 결과를 내기 때문에 발생한다.

주어진 float/double이 유한 부동소수점 값인지 확인하려면 해법에서 다음 조건을 활용한다. 주어진 float/double 값의 절댓값은 float/double 타입의 양의 최대 유한값(finite value)을 초과해서는 안 된다.

// float의 경우
Math.abs(f) <= Float.MAX_VALUE;

// double의 경우
Math.abs(d) <= Double.MAX_VALUE

자바 8부터 전용 플래그 메서드인 Float.isFinite()Double.isFinite()로 위 조건을 검사한다. 따라서 다음 테스트 케이스처럼 유한 부동소수점 값인지 확인한다.

Float f1 = 4.5f;
boolean f1f = Float.isFinite(f1); // f1 = 4.5는 유한하다

Float f2 = f1 / 0;
boolean f2f = Float.isFinite(f2); // f2 = Infinity는 유한하지 않다

Float f3 = 0f / 0f;
boolean f3f = Float.isFinite(f3); // f3 = NaN은 유한하지 않다

Double d1 = 0.000333411333d;
boolean d1f = Double.isFinite(d1); // d1 = 3.33411333E-4는 유한하다

Double d2 = d1 / 0;
boolean d2f = Double.isFinite(d2); // d2 = Infinity는 유한하지 않다

Double d3 = Double.POSITIVE_INFINITY * 0;
boolean d3f = Double.isFinite(d3); // d3 = NaN은 유한하지 않다

위 메서드들은 다음과 같은 조건문에서 유용하게 쓰인다.

if (Float.isFinite(d1)) {
  // 유한 부동소수점 값인 d1로 계산한다
} else {
  // 뒤이은 계산에 d1을 사용해서는 안 된다
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.