Why 0.1 + 0.2 ≠ 0.3 in Floating-Point Arithmetic
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

부동소수점 연산의 정확성 문제: 0.1 + 0.2 ≠ 0.3의 원인

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

데이터 분석

대상자

  • 프로그래밍 초보자 및 숫자 처리 관련 개발자(예: 데이터 분석, 과학 컴퓨팅)
  • IEEE 754 표준과 부동소수점 오류에 대한 기초 이해가 필요한 사람들
  • 난이도: 중급(기초 수학 지식 및 이진법 이해 필요)

핵심 요약

  • 부동소수점 오류는 10진수와 2진수의 표현 차이에서 비롯됨: 0.1은 이진법에서는 무한 반복 소수 0.000110011...로 표현됨
  • IEEE 754 표준이 주요 도구: 32비트(단정밀), 64비트(이중정밀) 형식으로 수를 저장하며, Mantissa(가수)와 Exponent(지수)를 사용
  • 부동소수점 덧셈 시 지수 정렬 필수: 0.1 + 0.2는 지수를 맞추는 과정에서 반올림 오류가 발생하여 0.3이 아닌 0.30000000000000004가 되는 것

섹션별 세부 요약

1. 10진수 vs 2진수 표현 차이

  • 10진수는 인간이 사용하는 표준, 2진수는 컴퓨터에서 사용
  • 0.1은 이진법에서 무한 반복 소수(0.000110011...)로 표현되어 정확한 값 저장 불가
  • 예시: 0.1 + 0.2는 이진법에서 0.000110011... + 0.00110011...로 계산되며, 결과가 0.3이 아님

2. IEEE 754 표준의 역할

  • IEEE 754 32비트(단정밀): 1비트 부호, 8비트 지수, 23비트 가수
  • IEEE 754 64비트(이중정밀): 1비트 부호, 11비트 지수, 52비트 가수
  • Bias 계산: Bias = 2^(k-1) - 1 (k=지수 비트 수)
  • 가수 정규화: 1.10011... × 2^(-4)와 같이 1.0 이상의 수로 표현

3. 부동소수점 덧셈 알고리즘

  • Step 1: 0.10.2를 이진법으로 변환(무한 반복 소수)
  • Step 2: 지수를 맞추기 위해 가수 이동(예: 0.1의 지수 -4-3로 맞춤)
  • Step 3: 가수 덧셈 후 반올림 (32비트 기준)
  • 결과: 0.1 + 0.2 = 0.30000000000000004 (이진법에서 표현 불가능한 오차)

4. 오류의 실무적 영향

  • 정밀도 요구 시 64비트(이중정밀) 사용 권장
  • 오차 누적이 중요한 계산(예: 금융, 과학 시뮬레이션)에서는 정수 기반 계산 또는 Decimal 모듈 사용
  • IEEE 754 라운딩 규칙 적용: ROUND_HALF_UP, ROUND_HALF_DOWN

결론

  • 부동소수점 오류는 10진수와 2진수의 표현 차이로 인해 발생하며, IEEE 754 표준이 이를 관리
  • 정확한 계산이 필요한 경우 64비트 이중정밀 사용 또는 Decimal 모듈 활용을 권장
  • "0.1 + 0.2 ≠ 0.3"은 이진법의 한계로 인한 현상이며, 반올림 오류의 실무적 영향을 고려해야 함