Computer Science

부동 소수점 연산에서 오버플로우와 언더플로우

ds3hfj 2025. 4. 18. 08:39

오버플로우 (Overflow)

너무 큰 수를 표현하려 할 때 발생

예: 1.0 × 10^500 같은 수는 부동소수점 포맷으로는 표현할 수 없음

  • IEEE 754에서는 이런 경우, 양의 무한대(+∞) 또는 음의 무한대(-∞) 로 처리됨
  • 계산 도중 오류가 발생하지는 않지만, 결과가 Infinity로 나옴
import numpy as np
np.exp(1000)  # 너무 커서 overflow 발생 → inf 반환

 

언더플로우 (Underflow)

너무 작은 수(0에 가까운 수)를 표현하려 할 때 발생

 

  • 수가 너무 작아서 0으로 수렴하거나, 서브노멀(subnormal) 값으로 표현됨
  • 오버플로우처럼 Infinity는 아니지만, 정밀도 손실이 발생할 수 있음
import numpy as np
np.float32(1e-50)  # underflow 발생 → 0.0으로 처리됨

 

 

서브노멀(Subnormal) 수란?

정규화(Normalized)된 부동소수점 수는 항상 가수 부분의 가장 앞자리가 1이어야 합니다.
IEEE 754에서는 이를 "1.xxx…" 형태로 간주하고, **이 1은 저장하지 않고 생략(hidden bit)**합니다.

하지만, 숫자가 너무 작아져서 이 가장 앞자리 1을 유지할 수 없을 때, 이를 포기하고 표현하는 방식이 서브노멀 수입니다.

 

  • 지수가 최소값보다 더 작을 때 (Exponent = 0)
  • 가수 앞의 숨겨진 1(hidden bit)을 사용하지 않음
  • 대신 0.xxx… 형태로 표현

예시 (단정도 32비트 기준)

  • 가장 작은 정규화 수:
    ≈ 1.18 × 10^-38
  • 서브노멀 최소값:
    ≈ 1.4 × 10^-45

즉, 서브노멀 덕분에 0보다 큰 아주 작은 수들을 표현할 수 있게 되죠!

 

'Computer Science' 카테고리의 다른 글

디자인 패턴 - 옵저버 패턴  (0) 2025.04.22
디자인 패턴 - 팩토리 패턴  (0) 2025.04.22
디자인 패턴 - 싱글톤 패턴  (0) 2025.04.22
ARM 프로세서  (5) 2025.04.18
고정 소수점 부동 소수점  (0) 2025.04.18