학습 자료 글/컴퓨터시스템

컴퓨터시스템 기초 7. 왜 실수는 10진수처럼 정확하게 저장되지 않을까

cedis 2026. 3. 31. 16:21

[컴퓨터 시스템] 7. 왜 실수는 10진수처럼 정확하게 저장되지 않을까

6편에서 바이트 순서를 봤다면, 이제 값 자체를 표현하는 규칙 중에서도 가장 자주 헷갈리는 부동소수점으로 넘어갈 차례입니다. 정수는 표현 범위와 규칙이 비교적 단단해 보이지만, 실수는 유한한 비트 안에서 훨씬 더 많은 값을 다뤄야 해서 근사라는 생각이 필수로 들어옵니다.

이번 글에서는 fixed-point와 floating-point를 비교하고, 왜 0.1 같은 값이 2진수에서 끝나지 않는지, 그리고 실수 비교에서 왜 '정확히 같다'가 위험해질 수 있는지까지 한 편에서 묶어 정리합니다.

먼저 짚고 갈 용어
fixed-point: 소수점 위치를 미리 고정해 두고 읽는 방식
floating-point: 지수를 이용해 소수점 위치를 움직이며 읽는 방식
significand: 유효숫자 부분으로, 실제 자릿수 정보를 주로 담는 영역
이번 글에서 다루는 것
  • 왜 실수는 정수보다 표현이 더 까다로운지
  • fixed-point와 floating-point의 발상 차이
  • 0.1을 2진수로 바꾸면 왜 반복이 생기는지
  • 부동소수점의 부호, 지수, 유효숫자 구조를 큰 그림으로 이해하기
  • 실수 비교에서 오차 허용 범위를 생각해야 하는 이유
한눈에 보는 흐름
1
왜 실수는 정수보다 표현이 더 까다로운지
2
fixed-point와 floating-point의 발상 차이
3
0.1을 2진수로 바꾸면 왜 반복이 생기는지
4
부동소수점의 부호, 지수, 유효숫자 구조를 큰 그림으로 이해하기

1. 실수 저장이 어려운 이유는 값 후보가 너무 촘촘하기 때문이다

정수는 칸칸이 떨어진 눈금처럼 생각할 수 있지만, 실수는 그 사이에도 값이 계속 들어갑니다. 그래서 유한한 비트 수로 모든 실수를 정확히 담는 방식은 만들 수 없습니다.

그림으로 먼저 보기
정수
표현 감각: 떨어진 칸 중 하나를 선택
결과: 상대적으로 정확하게 저장되기 쉽다
실수
표현 감각: 끝없이 촘촘한 선 위의 점을 근사
결과: 반올림과 근사가 필수로 들어간다

중요한 건 컴퓨터가 실수를 틀리게 다루는 것이 아니라, 애초에 표현 가능한 후보 중 가장 가까운 값을 고르는 구조라는 점입니다.

대상표현 감각결과
정수떨어진 칸 중 하나를 선택상대적으로 정확하게 저장되기 쉽다
실수끝없이 촘촘한 선 위의 점을 근사반올림과 근사가 필수로 들어간다
비유로 보면
정수 저장은 번호가 매겨진 좌석을 배정하는 것에 가깝고, 실수 저장은 끝없이 잘게 나뉜 선 위에서 한 위치를 찍는 일에 가깝습니다.

2. fixed-point는 단순하지만 범위와 유연성이 작다

fixed-point는 소수점 위치를 미리 약속해 두는 방식입니다. 해석은 단순하지만 아주 큰 수와 아주 작은 수를 동시에 유연하게 담기 어렵습니다.

그림으로 먼저 보기
해석이 단순하고 일정하다
한계: 넓은 범위와 높은 정밀도를 동시에 잡기 어렵다

그래서 fixed-point는 개념 이해에는 좋지만, 넓은 범위의 실수를 일반적으로 다루는 데는 한계가 있습니다.

장점한계
해석이 단순하고 일정하다넓은 범위와 높은 정밀도를 동시에 잡기 어렵다
과정 그림
1
8비트 표현에서 뒤의 2비트를 소수부로 쓰기로 약속한다.
2
00010110 같은 패턴을 000101.10 으로 읽는다.
3
이렇게 하면 계산은 단순하지만 소수점 위치를 마음대로 옮길 수는 없다.

3. floating-point는 소수점 위치를 지수로 움직이게 만든다

floating-point의 핵심은 소수점 위치를 고정하지 않고 지수(exponent)로 조절한다는 점입니다. 그래서 크기가 매우 다른 값을 한 형식 안에서 어느 정도 함께 다룰 수 있습니다.

그림으로 먼저 보기
sign
무슨 역할을 하나: 양수인지 음수인지 표시
exponent
무슨 역할을 하나: 소수점 위치를 얼마나 움직일지 결정
significand/fraction
무슨 역할을 하나: 실제 자릿수 정보를 주로 담음

대신 표현 구조가 더 복잡해지고, 근사와 반올림을 받아들여야 합니다.

구성 요소무슨 역할을 하나
sign양수인지 음수인지 표시
exponent소수점 위치를 얼마나 움직일지 결정
significand/fraction실제 자릿수 정보를 주로 담음
이 구조를 먼저 잡는 이유
세부 표준을 다 외우기 전에 부호, 지수, 유효숫자라는 큰 그림이 있어야 이후 IEEE 754 규칙이 덜 추상적으로 보입니다.

4. 왜 0.1은 2진수에서 끝나지 않을까

10진수에서 1/3이 0.333... 으로 끝나지 않는 것처럼, 2진수에서는 0.1이 반복 패턴을 만듭니다. 그래서 컴퓨터는 그 긴 패턴을 어느 지점에서 잘라 근사값으로 저장할 수밖에 없습니다.

단계값 × 2정수부다음 소수부
10.1 × 2 = 0.200.2
20.2 × 2 = 0.400.4
30.4 × 2 = 0.800.8
40.8 × 2 = 1.610.6
50.6 × 2 = 1.210.2
패턴이 반복된다는 뜻
5단계에서 다시 0.2가 나오므로 같은 과정이 반복됩니다. 즉 0.1은 2진수에서 유한하게 끝나지 않고, 결국 근사 저장이 필요합니다.

5. 그래서 0.1 + 0.2가 0.3과 딱 같지 않을 수 있다

사람이 기대하는 계산은 정확한 0.1 + 정확한 0.2 입니다. 하지만 컴퓨터 내부에서는 이미 저장 단계에서 각 값이 가장 가까운 근사값이므로, 결과도 0.3 근처의 근사값이 될 수 있습니다.

PYTHON
a = 0.1 + 0.2
b = 0.3
print(a)
print(a == b)
print(abs(a - b) < 1e-9)
실전 태도
실수 비교에서는 '정확히 같은가'보다 충분히 가까운가를 보는 경우가 많습니다. 물론 허용 오차는 상황에 맞게 정해야 합니다.

6. 여기서 특히 자주 생기는 오해

부동소수점은 초반에 오해가 특히 많이 생기는 주제입니다. 실수가 조금만 어긋나도 '컴퓨터가 틀린 계산을 한다'고 느끼기 쉽기 때문입니다.

헷갈리는 생각더 정확한 이해
컴퓨터는 0.1도 저장 못 한다저장은 하지만 정확한 값이 아니라 가장 가까운 표현 가능한 값으로 근사한다
실수 연산은 틀린 연산이다정해진 표현 규칙과 반올림 규칙 안에서 일관되게 계산한다
fixed-point가 항상 더 낫다범위와 유연성이 좁아 용도에 따라 선택이 달라진다
실수는 믿을 수 없다대부분의 계산에는 충분히 유용하지만 정확 비교가 필요한 상황은 주의가 필요하다

7. 직접 해볼 문제: 어떤 비교가 더 안전할까

이 문제는 부동소수점을 암기 대상이 아니라 사용 규칙으로 이해했는지 보는 데 목적이 있습니다.

미니 문제
`a == b` 와 `abs(a - b) < epsilon` 중 어떤 비교가 더 안전한지, 특히 0.1 + 0.2 같은 계산 결과에서 왜 그런지 설명해 보세요.

이번 글에서 기억할 것

실수 표현의 핵심은 정확한 원본 저장이 아니라 표현 가능한 값 중 가장 가까운 값을 고르는 데 있다.
floating-point는 소수점 위치를 지수로 움직여 범위를 넓히는 대신 근사와 반올림을 받아들인다.
실수 비교에서는 정확한 동일성보다 충분히 가까운지를 보는 습관이 중요하다.

스스로 점검

왜 실수는 정수보다 표현이 더 어려운지 한 문장으로 설명할 수 있는가
fixed-point와 floating-point의 가장 큰 차이를 말할 수 있는가
왜 0.1 + 0.2 비교에서 오차 허용 범위를 생각해야 하는지 설명할 수 있는가

다음 글 예고

다음 글에서는 값의 표현에서 한 단계 더 내려가, 논리 게이트와 회로에서 CPU까지 이어지는 하드웨어 쪽 큰 그림으로 넘어갑니다.

한 줄 정리
부동소수점은 실수를 틀리게 다루는 방식이 아니라, 유한한 비트 안에서 가장 가까운 값으로 근사해 표현하는 방식입니다.