고정 소수점과 부동 소수점 (Fixed Point and Floating Point)

한눈에 보기

컴퓨터가 실수를 표현하는 고정 소수점과 부동 소수점 방식을 비교한다. IEEE 754의 비트 구성과 편향 지수, 0.1 + 0.2 오차의 원인, FP16과 bfloat16 등 최신 흐름까지 정리한다.

최종 업데이트 2026.09.17

고정 소수점(fixed point)과 부동 소수점(floating point)은 컴퓨터가 실수를 이진수로 표현하는 두 가지 방식이다. 고정 소수점은 소수점의 위치를 미리 정해 두고 정수부와 소수부에 비트를 나누어 배정하는 방식이고, 부동 소수점은 수를 가수와 지수로 분리해 소수점의 위치를 떠다니게 함으로써 훨씬 넓은 범위를 표현하는 방식이다. 오늘날 대부분의 CPU와 프로그래밍 언어는 IEEE 754 표준의 부동 소수점을 기본으로 사용하며, 0.1 + 0.2가 정확히 0.3이 되지 않는 유명한 현상도 이 표현 방식에서 비롯된다.

고정 소수점 표현

고정 소수점은 전체 비트 중 일부를 정수부에, 나머지를 소수부에 고정적으로 할당한다. 예를 들어 16비트 중 8비트를 정수부, 8비트를 소수부로 쓰면 소수부의 각 비트는 1/2, 1/4, 1/8처럼 2의 음수 거듭제곱을 나타낸다. 구현이 단순해서 실수 연산을 사실상 정수 연산으로 처리할 수 있고, 연산 결과가 결정적이며 속도가 빠르다.

그러나 표현 범위와 정밀도가 비트 배분에 의해 고정된다는 한계가 뚜렷하다. 정수부를 늘리면 표현 범위는 커지지만 소수부가 줄어 정밀도가 떨어지고, 반대로 하면 큰 수를 담지 못한다. 그래서 고정 소수점은 부동 소수점 연산기(FPU, Floating Point Unit)가 없는 저가 임베디드 시스템, 디지털 신호 처리, 그리고 오차 규칙이 엄격히 정의되어야 하는 금융 계산의 십진 고정 소수점 타입 등 특정 영역에서 주로 쓰인다.

부동 소수점과 IEEE 754

부동 소수점은 실수를 부호(sign), 지수(exponent), 가수(mantissa 또는 significand)의 세 부분으로 나누어 표현한다. 과학적 표기법으로 12345를 1.2345 x 10^4로 쓰는 것과 같은 원리를 이진수에 적용해, 수를 1.xxx x 2^n 꼴로 정규화(normalization)한 뒤 xxx 부분을 가수에, n을 지수에 저장한다.

IEEE 754 표준의 단정밀도(single precision, 32비트)는 부호 1비트, 지수 8비트, 가수 23비트로 구성되고, 배정밀도(double precision, 64비트)는 부호 1비트, 지수 11비트, 가수 52비트로 구성된다. 지수부에는 음수 지수를 표현하기 위해 실제 지수에 편향값(bias)을 더해 저장하는데, 단정밀도는 127, 배정밀도는 1023을 더한다. 정규화된 수의 정수부는 항상 1이므로 이 1은 저장하지 않는 숨은 비트(hidden bit)로 처리해 정밀도를 1비트 벌어들인다. 또한 표준은 0, 무한대(infinity), 숫자가 아님(NaN, Not a Number), 그리고 0 근처의 아주 작은 수를 표현하는 비정규 수(denormalized number)까지 특수값으로 정의한다.

두 방식 비교

구분고정 소수점부동 소수점
소수점 위치설계 시점에 고정지수에 따라 이동
표현 범위좁음매우 넓음
정밀도 분포범위 전체에서 균일0 근처는 촘촘하고 큰 수는 성김
하드웨어 비용정수 연산기로 충분전용 FPU 필요
주 사용처임베디드, DSP, 금융 십진 연산범용 연산, 과학 계산, 그래픽

부동 소수점 오차가 생기는 이유

십진수 0.1은 이진수로 바꾸면 0.0001100110011...처럼 무한히 반복되는 소수가 된다. 가수의 비트 수는 유한하므로 어딘가에서 잘라내야 하고, 이때 발생하는 반올림 오차 때문에 0.1 + 0.2 == 0.3 비교가 거짓이 된다. 그래서 실수 비교는 두 값의 차이가 허용 오차(epsilon)보다 작은지 확인하는 방식으로 하는 것이 원칙이다.

크기가 크게 다른 두 수를 더하면 작은 수의 유효 자릿수가 사라지는 흡수 현상이 생기고, 비슷한 두 수를 빼면 유효 숫자가 대거 소실되는 소거(catastrophic cancellation)가 발생한다. 이런 특성 때문에 부동 소수점 덧셈은 결합 법칙이 성립하지 않으며, 병렬 연산에서 합산 순서가 바뀌면 결과가 미세하게 달라질 수 있다. 돈 계산처럼 십진 정확성이 필요한 곳에서는 이진 부동 소수점 대신 Java의 BigDecimal이나 Python의 decimal 같은 십진 타입, 또는 최소 단위를 정수로 다루는 방법을 쓴다.

최근 흐름, 좁아지는 부동 소수점

딥러닝의 확산으로 부동 소수점 형식은 오히려 다양해지고 있다. 학습과 추론에서는 64비트나 32비트의 정밀도가 과할 때가 많아, 절반 크기인 half precision(FP16), 지수부를 FP32와 같게 유지해 범위를 확보한 bfloat16, 나아가 8비트 형식인 FP8까지 GPU와 AI 가속기에 도입되었다. 정밀도를 낮추는 대신 같은 메모리와 대역폭으로 더 많은 수를 처리하는 이 흐름은, 표현 범위와 정밀도와 비용 사이의 균형이라는 부동 소수점 설계의 본질이 여전히 살아 있는 문제임을 보여준다.

면접에서 이렇게 물어본다

  • 고정 소수점과 부동 소수점의 차이를 표현 범위와 정밀도 관점에서 설명해보시오.
  • IEEE 754 단정밀도의 비트 구성과 편향 지수, 숨은 비트가 무엇인지 설명해보시오.
  • 0.1 + 0.2가 0.3과 정확히 같지 않은 이유를 설명해보시오.
  • 금융 서비스에서 금액 계산에 double을 쓰면 안 되는 이유와 대안을 말해보시오.
  • 딥러닝에서 FP16이나 bfloat16 같은 저정밀도 형식을 쓰는 이유를 설명해보시오.
컴퓨터 구조 문서 전체 보기

이 개념, 내 코드에서는 어떻게 물어볼까요

데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.

공고 넣고 시작하기