왜 0.1 + 0.2 ≠ 0.3? 부동소수점 오류 설명

왜 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.10.2가 2진수로 변환 시 무한 반복 소수(repeating fractions)가 되어, 유한한 비트 수로 표현 불가능하다.
  • 예: 0.1은 2진수로 0.0001100110011...로, 0.20.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정밀도와 범위의 균형을 이루기 위한 표준 방식이며, 오류를 완전히 피하기 어렵지만 현대 컴퓨팅의 핵심 기반이다.