8.4 오버플로우와 언더플로우 알아보기

정수 자료형과 마찬가지로 실수 자료형도 오버플로우와 언더플로우가 발생할 수 있습니다.

real_number_overflow_underflow.c

#include <stdio.h>
#include <float.h>    // 실수 자료형의 양수 최솟값, 최댓값이 정의된 헤더 파일

int main()
{
    float num1 = FLT_MIN;    // float의 양수 최솟값
    float num2 = FLT_MAX;    // float의 양수 최댓값

    // float의 양수 최솟값을 100000000.0으로 나누면 아주 작은 수가 되면서 언더플로우 발생
    num1 = num1 / 100000000.0f;

    // float의 양수 최댓값에 1000.0을 곱하면 저장할 수 있는 범위를 넘어서므로 오버플로우 발생
    num2 = num2 * 1000.0f;

    printf("%e %e\n", num1, num2);    // 0.000000e+00 inf: 실수의 언더플로우는 0
                                      // 오버플로우는 무한대가 됨

    return 0;
}

실행 결과

0.000000e+00 inf

FLT_MIN을 100000000.0과 같이 큰 수로 나누면 아주 작은 수가 되면서 언더플로우가 발생하는데 C 언어에서는 실수 언더플로우를 0 또는 쓰레기 값으로 처리합니다. 반대로 FLT_MAX에 1000.0을 곱하면 저장할 수 있는 범위를 넘어서기 때문에 오버플로우가 발생합니다. 정수와는 달리 실수는 오버플로우가 발생했을 때 최솟값으로 되돌아가지 않고 무한대(infinity)가 되므로 inf가 출력됩니다.

그림 8-2 float의 오버플로우와 언더플로우

지금까지 정수와 실수에 대해 배웠는데 여러 가지 개념들이 등장해서 내용이 좀 어려웠을 겁니다. 오버플로우와 언더플로우는 이런 것도 있다 정도로만 알아두면 되고 내용을 모두 기억할 필요는 없습니다. 나중에 필요할 때 다시 돌아와서 찾아보면 되니까요.

우리는 실생활에서 1과 1.0을 구분하지 않지만 컴퓨터는 1과 1.0을 정수와 실수로 구분합니다. 마찬가지로 C 언어는 컴퓨터를 제어하는 언어라 정수와 실수를 구분합니다. 따라서 여러분들은 이 부분만 기억하면 되고, 자신이 표현할 데이터가 정수인지 실수인지만 구분할 수 있으면 됩니다.