부동소수점의 특수값 표현 (오버플로우 / inf / Nan)

hwhyeons·2025년 3월 20일

정수형의 경우 오버플로우가 발생하면 양수가 음수의 낮은 값으로 뒤집히는 특징이 있다.
이렇게 되는 이유는 저장방식 때문이다.

이걸 생각하다보니, 실수형 타입에서는 오버플로우가 발생하면 어떻게 표현되는지 궁금해서 알아보게 되었다.

부동소수점의 특수값

부동소수점의 특수값으로는 inf, -inf, Nan 등이 있다.

inf

+inf, -inf는 각각 양의 무한대와 음의 무한대를 나타낸다.
이는 부동소수점 연산에서 오버플로우가 발생한 경우도 마찬가지다.

C++에서

std::cout << numeric_limits<float>::max() *2 << endl;

코드를 실행해보면 inf가 출력됨을 알 수 있다.

C언어에서 부동소수점 타입의 INF라는 상수는 실제로 매우 큰 값 * 매우 큰 값
로 정의되어 있다.

#define INFINITY   ((float)(_HUGE_ENUF * _HUGE_ENUF))


#define _HUGE_ENUF  1e+300 

-inf는 음의 무한대다.

비트열로 표현하면,
부호비트가 0이고 지수부가 전부 1이고 가수부가 전부 0이면 양의 inf
부호비트가 1이고 지수부가 전부 1이고 가수부가 전부 0이면 음의 inf




Nan

Nan은 숫자가 아닌 값을 나타낸다.
예를 들어 0/0 같은 경우다.

정수형 타입으로 0/0을 하면 일부 언어는 예외가 발생하거나,
일부 언어는 엉뚱한 값이 출력된다.

부동소수점에서는 Nan이 출력된다

cout << 0.0/0.0; // nan

또는 확정되지 않은 값이 있을 수 있다

float inf_value = numeric_limits<float>::max() *2;
cout << 0*inf_value << endl; // nan

0*Nan과 같은 값이 Nan이 될 수 있다

nan은 지수부가 전부 1이면서 가수부가 전부 0이 아니라면 Nan으로 표현된다



0 (Zero)

0 자체는 특별한 값이 아니지만, 부동소수점에서 표현될 때는 일반적인 숫자와
다르게 표현된다.

부동소수점에서 0은 정수형의 0과 다르게 +0과 -0이 둘다 존재한다.

비트열의 모든 비트가 0이면 +0,
부호비트만 1이고 나머지 모든비트가 0이면 -0이다.

처음에는 0이 왜 따로 존재할까 궁금했는데,
사실 부동소수점은 a^n + b 형식으로 표현하는 방식이다보니,
0을 형식에 맞춰서 표현한다는게 불가능하다는 것도 자연스럽게 알게 되었다.

a^x 지수함수 그래프를 생각해보면 0에 끝없이 가까워질 수는 있어도
0이 될 수는 없다.

https://learn.microsoft.com/ko-kr/cpp/build/ieee-floating-point-representation?view=msvc-170 에는

"0은 정규화할 수 없습니다. 그러므로 단정밀도 또는 배정밀도 값의 정규화된 형식에서는 표현할 수 없습니다. 모든 0의 특수 비트 패턴은 0을 나타냅니다. 부호 비트가 설정된 상태에서 -0을 0으로 나타낼 수도 있지만, -0과 0은 항상 같음으로 비교됩니다."
라고 설명 되어 있다.


위에서 적었던 비트열들은 링크에서 직접 비트 값을 설정해가며 테스트 해볼 수 있다.



관련글

https://velog.io/@hwhyeons/부동소수점-표현에서-bias를-쓰는-이유

0개의 댓글