부동소수점+실수계산 오차

Gunju Kim·2025년 3월 19일
0

필수시청 영상

목록 보기
4/32

부동소수점 표현 방식이란?

컴퓨터는 실수를 이진수로 표현하기 위해, 주로 IEEE 754라는 표준을 사용합니다.
이 표준에 따라 숫자는 다음과 같은 형태로 표현됩니다.

  • 부호(sign) : 양수(0) 또는 음수(1)
  • 가수(mantissa) : 숫자 유효 자릿수
  • 지수(exponent) : 소수점의 위치를 결정

예) 10진수 5.25는 이진수로 101.01이며 부동소수점 표현으로는

  • 1.0101×2^2 형태로 저장됩니다.

부동소수점에서 오차가 발생하는 이유

컴퓨터는 무한한 정밀도로 실수를 저장할 수 없습니다. 정밀도가 제한된 이진수로 표현하면서 근사값을 사용하게 되고, 이로 인해 정확한 숫자가 아닌 근사한 숫자가 저장됩니다.

(1) 이진법으로 정확히 표현할 수 없는 실수가 존재

컴퓨터가 사용하는 2진법으로는 10진수의 일부 숫자들을 정확하게 표현할 수 없습니다.

예를 들어:

  • 10진수의 0.1을 정확히 2진수로 표현하면 무한히 반복되는 순환 소수가 됩니다.

  • 컴퓨터는 일정한 자리수에서 끊어 근사값으로 저장할 수밖에 없으며, 이 과정에서 오차가 발생합니다.

예시) python

print(0.1 + 0.2)
# 출력: 0.30000000000000004

(2) 제한된 비트수로 인한 정밀도의 한계

부동소수점은 정밀도가 제한되어 있기 때문에 매우 크거나 매우 작은 수를 저장할 때 반드시 오차가 발생합니다.

대표적으로:

  • 단정도(float) : 가수부 23비트(약 7자리의 10진 정밀도)
  • 배정도(double) : 가수부 52비트(약 15자리의 10진 정밀도)

정밀도 이상의 숫자는 반올림(rounding) 되며, 오차가 누적될 수 있습니다.

(3) 연산 과정에서 오차 누적

연산이 반복될 경우 반올림 오차(round-off error) 가 점점 커질 수 있습니다.
예를 들어, 매우 작은 수와 큰 수를 더할 때:

a = 1e20
b = 1.0
print(a + b) # 출력: 1e20 (b는 반영되지 않음)
  • 상대적으로 작은 숫자는 큰 숫자에 더해도, 정밀도 한계로 인해 무시되는 오차가 발생합니다.

오차의 대표적 예시들

print(0.1 + 0.2 == 0.3) # False
print(1.1 + 2.2) # 3.3000000000000003

부동소수점 오차를 해결하는 방법

부동소수점 오차 자체를 완벽히 없앨 수는 없지만, 줄이거나 회피하는 방법은 있습니다.

방법 1 : 반올림(Rounding) 활용

print(round(0.1 + 0.2, 10)) # 0.3

방법 2 : 정수형으로 변환 후 계산

금융 계산처럼 정확도가 중요할 때, 화폐 단위로 바꿔 정수로 계산합니다.
예를 들어 0.1원을 계산할 때,→ 0.1원을 10전으로 바꾸어 정수로 계산 후, 다시 원 단위로 복귀.

amount1 = 10 # 0.10원 → 10전
amount2 = 20 # 0.20원 → 20전
print((amount1 + amount2)/100) # 정확히 0.3원

방법 3 : 고정소수점 연산을 지원하는 라이브러리 사용

예시 (Python의 Decimal 라이브러리):

from decimal import Decimal

a = Decimal('0.1')
b = Decimal('0.2')
print(a + b) # 정확히 0.3

요약 정리

  • 부동소수점 표현법은 실수를 근사한 이진수 형태로 저장하여 오차가 발생합니다.
  • 특히 10진수의 일부 숫자(예: 0.1) 는 정확한 이진 표현이 불가능합니다.
  • 연산 과정에서 오차가 축적될 수 있으며, 이를 방지하기 위한 대안이 존재합니다.

부동소수점 오차는 컴퓨터가 실수를 이진수 형태로 유한한 비트 수로 표현하는 과정에서 필연적으로 발생하는 정밀도의 한계 때문입니다.

profile
처음이라서 그래 가본적 없던 길에

0개의 댓글