JAVA/JAVA

NaN과 Infinity

호두밥 2021. 9. 24. 00:43

개념

NaN : Not a Number, 숫자가 아닌 값 

Infinity : 무한대

System.out.println( 5 % 0.0);
System.out.println( 5 / 0.0);
NaN
Infinity

 

실제 연산 시 ArithmeticException이 발생함.

System.out.println( Integer.valueOf(5%0) );
System.out.println( Integer.valueOf(5/0) );
Exception in thread "main" java.lang.ArithmeticException: / by zero

특징

/, % 연산의 우측 연산자가 0일때 나타남.

이 값들에 추가 연산을 해도 NaN 또는 Infinity가 그대로 출력됨.

 

처리방법

해당 값이 NaN이나 Infinity인지 판별하는 로직을 추가한다.

Float.isFinite( val )

val이 NaN이나 Infinity가 아니면 TRUE, 해당되면 FALSE를 반환

입력값이 float 자료형의 최대값 범위 안이면 TRUE를 반환

    public static final float MAX_VALUE = 0x1.fffffeP+127f; // 3.4028235e+38f

    public static boolean isFinite(float f) {
        return Math.abs(f) <= Float.MAX_VALUE;
    }

Float.isInfinite( val )

val이 Infinity면 TRUE, 아니면 FALSE

입력값이 1을 0으로 나눈 양의 무한대값 과 -1을 0으로 나는 음의 무한대값 중 하나와 일치하면 TRUE를 반환

 public static final float POSITIVE_INFINITY = 1.0f / 0.0f;
 public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;
 
 public static boolean isInfinite(float v) {
        return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY);
 }

Float.isNaN( val )

val이 NaN이면 TRUE, 아니면 FALSE

입력값을 자기자신과 비교해 다르면 TRUE를 반환하도록 해서 판별함.

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

Double.isFinite( val )

Float과 동일

Double.isInfinite( val )

Float과 동일

Double.isNaN( val )

Float과 동일

 

 

출처

  • 이것이 자바다, 신용권, 한빛미디어

 

'JAVA > JAVA' 카테고리의 다른 글

Objects 클래스  (0) 2021.09.28
Object Class  (0) 2021.09.28
java.lang 패키지  (0) 2021.09.27
어노테이션 Annotation (@)  (0) 2021.09.26
데이터 타입 Data Type  (0) 2021.09.24