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가 출력됩니다.
실수가 무한대인지 검사하는 방법과 실수가 숫자가 아닌지 판단하는 방법은 '부록 5. 실수의 무한대와 숫자가 아닌 값 검사'를 참조하세요.
지금까지 정수와 실수에 대해 배웠는데 여러 가지 개념들이 등장해서 내용이 좀 어려웠을 겁니다. 오버플로우와 언더플로우는 이런 것도 있다 정도로만 알아두면 되고 내용을 모두 기억할 필요는 없습니다. 나중에 필요할 때 다시 돌아와서 찾아보면 되니까요.
우리는 실생활에서 1과 1.0을 구분하지 않지만 컴퓨터는 1과 1.0을 정수와 실수로 구분합니다. 마찬가지로 C 언어는 컴퓨터를 제어하는 언어라 정수와 실수를 구분합니다. 따라서 여러분들은 이 부분만 기억하면 되고, 자신이 표현할 데이터가 정수인지 실수인지만 구분할 수 있으면 됩니다.