1. 개요

0으로 나누는 것은 일반 산술에서 의미가 없는 연산이므로 정의되지 않습니다. 그러나 프로그래밍에서는 종종 오류와 연관되지만 항상 그런 것은 아닙니다 .

이 기사에서는 Java 프로그램에서 0으로 나누기가 발생할 때 어떤 일이 발생하는지 살펴보겠습니다 .

나누기 연산 의 Java 사양에 따르면 0으로 나누는 두 가지 다른 경우인 정수와 부동 소수점 숫자를 식별할 수 있습니다.

2. 정수

첫째, 정수의 경우 상황이 매우 간단합니다. 정수를 0으로 나누면 ArithmeticException 이 발생합니다 .

assertThrows(ArithmeticException.class, () -> {
    int result = 12 / 0;
});
assertThrows(ArithmeticException.class, () -> {
    int result = 0 / 0;
});

3. 부동 소수점 유형

그러나 부동 소수점 숫자를 처리 할 때 예외가 발생하지 않습니다 .

assertDoesNotThrow(() -> {
    float result = 12f / 0;
});

이와 같은 경우를 처리하기 위해 Java는 NaN , POSITIVE_INFINITYNEGATIVE_INFINITY 와 같은 작업의 결과를 나타낼 수 있는 몇 가지 특수 숫자 값을 사용합니다 .

3.1. NaN

부동 소수점 0 값을 0 으로 나누어 시작해 보겠습니다 .

assertEquals(Float.NaN, 0f / 0);
assertEquals(Double.NaN, 0d / 0);

이러한 경우 결과는 NaN (숫자가 아님)입니다.

3.2. 무한대

다음 으로 0이 아닌 값을 0으로 나누 겠습니다 .

assertEquals(Float.POSITIVE_INFINITY, 12f / 0);
assertEquals(Double.POSITIVE_INFINITY, 12d / 0);
assertEquals(Float.NEGATIVE_INFINITY, -12f / 0);
assertEquals(Double.NEGATIVE_INFINITY, -12d / 0);

보시다시피 결과는 피연산자의 부호에 따라 부호가 달라지는 INFINITY 입니다.

또한 NEGATIVE_INFINITY 에 도달하기 위해 음의 0 개념을 사용할 수도 있습니다 .

assertEquals(Float.NEGATIVE_INFINITY, 12f / -0f);
assertEquals(Double.NEGATIVE_INFINITY, 12f / -0f);

3.3. 메모리 표현

그렇다면 정수를 0으로 나누면 예외가 발생하는 반면 부동 소수점을 0으로 나누면 예외가 발생하는 이유는 무엇입니까?

이를 메모리 표현 관점에서 살펴보겠습니다. 정수의 경우 이러한 연산 의 결과를 저장하는 데 사용할 수 있는 비트 패턴이 없지만 부동 소수점 숫자에는 이러한 경우에 사용할 NaN 또는 INFINITY 와 같은 값이 있습니다.

이제 부호에 대한 1비트(S), 지수에 대한 8비트(E), 가수에 대한 나머지(F)가 있는 S EEEEEEE E FFFFFFF FFFFFFFF FFFFFFFF 로 플로트의 이진 표현을 고려하십시오 .

세 값 NaN , POSITIVE_INFINITY 및 NEGATIVE_INFINITY 각각 에서 지수 부분의 모든 비트는 1로 설정됩니다.

INFINITY 에는 모두 0으로 설정된 가수 비트가 있고 NaN 에는 0이 아닌 가수가 있습니다.

assertEquals(Float.POSITIVE_INFINITY, Float.intBitsToFloat(0b01111111100000000000000000000000));
assertEquals(Float.NEGATIVE_INFINITY, Float.intBitsToFloat(0b11111111100000000000000000000000));
assertEquals(Float.NaN, Float.intBitsToFloat(0b11111111100000010000000000000000));
assertEquals(Float.NaN, Float.intBitsToFloat(0b11111111100000011000000000100000));

4. 요약

요약하자면, 이 기사에서 Java에서 0으로 나누기가 작동하는 방식을 살펴보았습니다.

INFINITYNaN 과 같은 값 은 부동 소수점 숫자에 사용할 수 있지만 정수에는 사용할 수 없습니다 . 결과적으로 정수를 0으로 나누면 예외가 발생합니다. 그러나 float 또는 double 의 경우 Java에서 작업을 허용합니다.

전체 코드는 GitHub에서 사용할 수 있습니다 .

Generic footer banner