왜 0.1 + 0.2가 항상 0.3이 되지 않는가? : 부동소수점 설명
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
데이터 분석
대상자
- 프로그래머, 특히 수치 계산, 금융 시스템, 과학 시뮬레이션, 항공우주 분야 개발자
- 중급~고급 수준의 이해가 필요한 기술적 개념 설명
핵심 요약
- 부동소수점 연산(floating-point arithmetic)은 10진수를 2진수로 변환할 때 정확한 표현이 불가능하여 발생하는 오류로,
0.1 + 0.2 = 0.30000000000000004
와 같은 결과를 낳는다. - IEEE 754 표준은 부동소수점을 32비트 또는 64비트로 압축하여 표현하는 시스템으로, 부호(sign bit), 지수(exponent), 가수(mantissa)로 구성된다.
- 실무 적용 시는 고정소수점(fixed-point arithmetic) 또는 정확한 10진수 계산 라이브러리(decimal libraries)를 사용하고, 부동소수점 비교 시 epsilon 값을 사용해야 한다.
섹션별 세부 요약
1. 부동소수점 오류의 예시 및 원인
0.1 + 0.2
연산은 10진수0.1
과0.2
가 2진수로 변환 시 무한 반복 소수(repeating fractions)가 되어, 유한한 비트 수로 표현 불가능하다.- 예:
0.1
은 2진수로0.0001100110011...
로,0.2
는0.001100110011...
로 표현되며, 이로 인해 조그만 오류(0.00000000000000004)가 발생한다. - 이는 컴퓨터가 10진수를 직접 이해하지 못하고, 2진수로만 연산하기 때문이며, 정확한 표현이 불가능한 경우이다.
2. IEEE 754 표준의 구조 및 작동 원리
- 부호(1비트):
0
이면 양수,1
이면 음수. - 지수(8비트): 수의 스케일을 나타내며, 편향(biased exponent) 방식으로 저장(예: 32비트 시 127 추가).
- 가수(23비트): 수의 유의미한 자릿수를 저장.
- IEEE 754는 무한한 수의 범위를 32비트 또는 64비트로 압축하여 표현하는 시스템이다.
- 특수 값:
NaN
(Not a Number),Infinity
,-0
등이 정의되어 있다.
3. 부동소수점 오류의 실제 영향 및 대응 방안
- 금융 시스템: 수백만 건의 거래에서 작은 오류가 누적되어 손실 또는 과다 청구로 이어질 수 있다.
- 해결책: 고정소수점(fixed-point arithmetic) 또는 정확한 10진수 계산 라이브러리(예: Python의
decimal
모듈) 사용. - 과학 시뮬레이션: 기후 모델링 등에서 작은 오류가 결과에 크게 영향을 줄 수 있다.
- 해결책: 고정밀도(high-precision) 형식 및 오류 수정 기법 적용.
- 항공우주: 1991년 패트리엇 미사일 실패 사례에서 0.1초의 시간 오류가 미사일 사격 실패로 이어졌다.
- 해결책: 고정밀도(float64) 사용 및 정밀도 높은 연산 보장.
- 머신러닝: 수십억 건의 연산에서 부동소수점 오류가 모델 정확도에 영향을 줄 수 있다.
- 해결책: 혼합 정밀도(mixed-precision) 기법 사용.
4. 실무에서의 대응 전략
- 정확한 계산이 필요한 경우:
float64
또는decimal
모듈 사용. - 부동소수점 비교 시: 두 수의 차이가 epsilon(예:
0.000000001
) 이하인지 확인. - 시스템 설계 시: 정밀도가 중요한 분야(금융, 과학, 항공)에서는 엄격한 테스트와 오류 검증이 필수적이다.
결론
- 부동소수점 오류는 정확한 수치 계산에 필수적인 개념이며, 실무에서 이를 피하기 위해 고정소수점,
decimal
모듈,float64
, epsilon 비교 등을 적용해야 한다. - IEEE 754는 정밀도와 범위의 균형을 이루기 위한 표준 방식이며, 오류를 완전히 피하기 어렵지만 현대 컴퓨팅의 핵심 기반이다.