Underflow는 수치 계산에서 발생할 수 있는 오류로, 매우 작은 값을 처리할 때 나타납니다. 주로 부동소수점(floating-point) 연산이나 정수형 변수에서 발생하며, 값이 표현할 수 있는 최솟값보다 작아지는 상황을 말합니다. 이를 더 자세히 설명하면 다음과 같습니다.
1. 정수형 언더플로우 (Integer Underflow)
정수형 변수에서 최솟값보다 작은 값을 표현하려 할 때 발생합니다. 예를 들어, int 자료형은 일반적으로 -2,147,483,648에서 2,147,483,647 사이의 값을 저장할 수 있습니다. 만약 이 범위를 벗어나면 언더플로우가 발생할 수 있습니다.
#include <stdio.h>
int main() {
int a = -2147483648;
a -= 1; // Underflow 발생
printf("%d\n", a); // 출력: 2147483647
return 0;
}
이 예제에서, int 변수는 언더플로우가 발생하며 값이 가장 큰 양의 값으로 바뀝니다. 이는 wrap-around 동작과 연결되어 있으며, 비트 연산 결과로 인해 이런 현상이 나타납니다.
[C언어] warp-around
C 언어에서 Wrap-around는 특정 데이터 타입의 최대값이나 최소값을 초과할 때 값이 다시 최소값 또는 최대값으로 돌아가는 현상을 말합니다. 이는 데이터 타입의 고정된 비트 크기 때문에 발생하
jeagyoo2.tistory.com
2. 부동소수점 언더플로우 (Floating-point Underflow)
부동소수점 연산에서 너무 작은 값을 처리할 때 발생하며, 보통 해당 값이 0으로 처리됩니다. 예를 들어, 매우 작은 값을 저장하려고 할 때 그 값이 부동소수점의 최소 표현 범위보다 작다면, 0으로 표현될 수 있습니다.
#include <stdio.h>
int main() {
float smallValue = 1.0e-40;
float result = smallValue / 1.0e40; // Underflow 발생
printf("%e\n", result); // 출력: 0.000000e+00
return 0;
}
이 코드에서 smallValue는 1.0e-40처럼 매우 작은 수인데, 이를 매우 큰 값으로 나누면 결과는 언더플로우로 인해 0이 됩니다.
3. 언더플로우 방지
언더플로우를 방지하기 위해서는 연산 전에 값이 자료형의 최소값 이하로 떨어지지 않는지 확인하는 것이 중요합니다. 예를 들어, 정수형 변수의 경우 if문을 사용하여 연산 전에 값의 범위를 확인할 수 있습니다.
if (a - 1 >= INT_MIN) {
a -= 1;
}
부동소수점 연산에서도 매우 작은 값이 0으로 처리되지 않도록 값을 미리 확인하거나, 적절한 값을 사용하는 것이 좋습니다.
4. 언더플로우와 오버플로우의 차이
언더플로우는 값이 최솟값보다 더 작아질 때 발생하고, 오버플로우는 값이 최댓값을 넘어설 때 발생하는 반대 개념입니다. 두 상황 모두 변수에 저장할 수 없는 값이 발생하며, 컴퓨터는 이를 wrap-around를 통해 처리하거나 부동소수점의 경우 0으로 처리하는 방식으로 대응합니다.
'C언어' 카테고리의 다른 글
[C언어] 반복문-for 반복문, while 반복문, do-while 반복문 (0) | 2024.10.06 |
---|---|
[C언어] 루프 카운터(loop counter)란? (0) | 2024.10.04 |
[C언어] overflow (0) | 2024.10.01 |
[C언어] warp-around (1) | 2024.09.29 |
[C언어] 주석[C언어] 주석 (0) | 2024.09.28 |