031 double/float가 유한 부동소수점 값인지 검사
이 문제는 일부 부동소수점 메서드와 연산에서 예외를 던지는 대신 Infinity나 NaN으로 결과를 내기 때문에 발생한다.
주어진 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을 사용해서는 안 된다
}