ieee754 floating-point computer-science precision programming-fundamentals

IEEE 754 부동 소수점 표준: 컴퓨터 산술의 이해

프로그래밍에서 왜 0.1 + 0.2 != 0.3일까요? IEEE 754 부동 소수점 표현 방식과 정밀도 메커니즘을 알아보세요.

2026-04-11

IEEE 754 부동 소수점 표준: 컴퓨터 산술의 이해

프로그래밍을 하다 보면 기이한 현상을 마주하게 됩니다. 바로 0.1 + 0.20.3과 같지 않다는 점입니다. 대신 0.30000000000000004와 같은 결과를 얻게 됩니다. 이것은 언어의 버그가 아니라, 컴퓨터가 IEEE 754 표준을 사용하여 실수를 표현하는 방식에서 비롯된 근본적인 결과입니다.

이 가이드에서는 IEEE 754 표준을 파헤치고, 부동 소수점이 어떻게 저장되는지 설명하며, 코드에서 정밀도 문제를 처리하는 팁을 제공합니다.


IEEE 754란 무엇인가요?

IEEE 부동 소수점 산술 표준 (IEEE 754)은 부동 소수점 계산에 가장 널리 사용되는 표준입니다. 1985년에 제정되었으며, 실수를 이진수로 표현하는 형식과 그에 대한 연산을 정의합니다.

가장 일반적인 형식은 다음과 같습니다.

  • 단정밀도 (32비트): C/C++/Java의 float.
  • 배정밀도 (64비트): C/C++/Java의 double. JavaScript와 Python의 기본 숫자 유형입니다.

작동 원리: 부동 소수점의 구조

부동 소수점은 과학적 표기법($1.23 \times 10^4$)과 유사한 방식으로 표현되지만 이진수 형태입니다. 다음 세 부분으로 구성됩니다.

  1. 부호 비트 (1비트): 0은 양수, 1은 음수.
  2. 지수 (Exponent): 숫자의 크기(범위)를 결정.
  3. 가수 (Mantissa/Significand): 유효 숫자를 표현.

64비트 배정밀도 레이아웃:

  • 부호: 1비트
  • 지수: 11비트
  • 가수: 52비트

사용되는 공식은 다음과 같습니다. $(-1)^{sign} \times (1.mantissa) \times 2^{exponent - bias}$


왜 $0.1 + 0.2 \neq 0.3$ 인가요?

근본적인 원인은 대부분의 십진수 소수를 이진수로 정확하게 표현할 수 없기 때문입니다.

  • 10진수에서 분수는 분모의 소인수가 2와 5(10의 약수)뿐인 경우에만 정확하게 표현될 수 있습니다.
  • 2진수에서 분수는 분모의 소인수가 2뿐인 경우에만 정확하게 표현될 수 있습니다.

$0.1$은 $1/10$입니다. 10은 5라는 인수를 가지고 있기 때문에 이진수로는 무한 반복되는 수열이 됩니다. 0.00011001100110011...

컴퓨터는 이 무한 수열을 32비트 또는 64비트 안에 맞추기 위해 반올림(절삭)을 해야 하며, 이로 인해 우리가 보는 미세한 오차가 발생합니다.


특수 값

IEEE 754는 예외적인 상황을 처리하기 위해 몇 가지 특수 값도 정의합니다.

  • NaN (Not a Number): 정의되지 않은 연산의 결과 (예: 0/0).
  • Infinity ($\infty$): 오버플로우 또는 0으로 나눈 결과 (예: 1/0).
  • 음의 0 (-0): 일부 계산에서 양의 0과 구분됩니다.

개발자를 위한 권장 사항

  1. 부동 소수점 비교에 ==를 사용하지 마세요: 항상 두 값의 차이가 아주 작은 값(epsilon)보다 작은지 확인하세요.
    if (Math.abs(0.1 + 0.2 - 0.3) < Number.EPSILON) { ... }
    
  2. 화폐 계산에는 Decimal 사용: 금융 계산의 경우 전용 라이브러리(예: decimal.js)를 사용하거나 값을 정수(예: 달러 대신 센트 단위)로 저장하세요.
  3. 범위에 유의하세요: 배정밀도는 매우 큰 숫자를 표현할 수 있지만, 숫자가 커질수록 정밀도는 낮아집니다.

자주 묻는 질문 FAQ

Q: 부동 소수점 연산은 비결정적인가요? A: 일반적으로는 아닙니다. 동일한 입력과 동일한 반올림 모드가 주어지면 IEEE 754는 동일한 결과를 생성해야 합니다. 하지만 컴파일러나 CPU 명령어(FMA 등)에 따라 미세한 차이가 발생할 수 있습니다.

Q: "BigInt"란 무엇인가요? A: JavaScript의 BigInt는 임의 정밀도의 정수를 처리합니다. 소수는 처리하지 못합니다. 소수가 필요한 경우 Decimal 라이브러리가 필요합니다.

Q: 배정밀도는 십진수로 몇 자리까지 정확한가요? A: 64비트 배정밀도는 약 15~17자리의 유효한 십진수 자릿수를 가집니다.


관련 도구

  • 단위 변환기 - 다양한 측정 단위 간의 정확한 변환을 수행합니다.
  • JSON 포맷터 - JSON 데이터에서 숫자가 어떻게 표현되는지 확인하세요.
  • 해시 생성기 - 비트 하나하나가 중요한 데이터 무결성을 검증하세요.