최근 수정 시각 : 2024-01-07 18:09:07

언더플로

1. 오버플로의 잘못된 표현2. floating point underflow3. 언더플로 발생 조건4. 버퍼 언더런

1. 오버플로의 잘못된 표현

컴퓨터에서 어떤 수에서 계속 뺄셈을 하다 보면 갑자기 큰 수로 바뀌는 현상을 '언더플로'라고 말하는 경우가 있는데, 틀린 표현이다. 이 경우도 오버플로라고 부르는 것이 맞는다.

다만, 굳이 이 상황을 오버플로와 구분해서 표현해야 하는 경우 '정수 언더플로(integer underflow)'로 표현하는 경우가 있긴 하지만, 일반적이지는 않다.

2. floating point underflow

부동소수점 언더플로(floating point underflow) 또는 산술 언더플로(arithmetic underflow)는 컴퓨터에서 부동소수점으로 표현된 수에서, 지수(E)가 최솟값보다 낮아지는 상황을 뜻한다. 예를 들어 IEEE 754의 단정밀도 실수(single-precision)에서 표현가능한 지수의 값은 −126 ~ +127 이다. 그런데, 2-100 * 2-100 을 계산하면 2-200 이 되어야 하는데, 단정밀도에서는 지수의 값을 -126까지만 처리할 수 있으므로 범위를 벗어나는 값이 된다.

이 상황에 대해서 어떻게 처리해야 하는지는 명확하게 규정되어 있지 않는데, 대체로 다음 중 한 가지 방법으로 구현한다.
  • 0 으로 처리 - 0에 가까운 아주 작은 값이므로 그냥 0 으로 근사하는 것이다. 다만, 수학적으로 0 이 아닌 2개의 실수를 곱해서 0 이 된다는 문제가 존재한다.
  • 최솟값으로 처리 - 단정밀도 실수에서 표현할 수 있는 최소의 양수는 denormalized number를 지원할 경우 0.000 0000 0000 0000 0000 0001(2) × 2-126 = 2-149 이고, 지원하지 않을 경우는 2−126인데, 이 값으로 처리할 수 있다.
  • NaN 으로 처리 - 계산 오류에 해당하므로 NaN 으로 처리할 수도 있다.

3. 언더플로 발생 조건

우선 0에서 약 4e-324보다도 작은 값을 더하거나 빼는 것은 0으로 취급한다.

0에 상대적으로 가깝지 않은 임의의 수가 현재 값이라고 치자. 현재 값이 1000조보다 작다면 현재 값의 10만 분의 1보다 작은 값을 더하거나 빼는 것은 취급도 안 한다. 하지만 1000조 이상이라면 현재 값의 10경 분의 1보다 작은 값을 더하거나 빼는 것 정도는 되어야 취급을 안 한다.

4. 버퍼 언더런

버퍼 언더런(buffer under-run)을 언더플로라고 부르기도 한다.
하나의 프로세스는 버퍼를 데이터를 채우고, 하나의 프로세스는 그 데이터를 꺼내서 처리한다고 하자. 그런데, 채우는 프로세스 보다 꺼내는 프로세스가 더 빠르게 동작하면, 버퍼에 데이터가 없어서 아무일도 안하게 된다. 때로는 여기서 '락'이 걸려 전체 프로세스가 멈추는 버그도 흔히 존재했다. 이를 버퍼 언더런이라고 부른다.

초창기 CD Writer 는 버퍼 언더런이 발생하면, 굽던 CD 가 비정상 종료되며 깨져 버리는 문제가 있었다.