부동소수점 연산의 정확성 문제: 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.1
과0.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"은 이진법의 한계로 인한 현상이며, 반올림 오류의 실무적 영향을 고려해야 함