[컴퓨터 시스템] 7. 왜 실수는 10진수처럼 정확하게 저장되지 않을까
6편에서 바이트 순서를 봤다면, 이제 값 자체를 표현하는 규칙 중에서도 가장 자주 헷갈리는 부동소수점으로 넘어갈 차례입니다. 정수는 표현 범위와 규칙이 비교적 단단해 보이지만, 실수는 유한한 비트 안에서 훨씬 더 많은 값을 다뤄야 해서 근사라는 생각이 필수로 들어옵니다.
이번 글에서는 fixed-point와 floating-point를 비교하고, 왜 0.1 같은 값이 2진수에서 끝나지 않는지, 그리고 실수 비교에서 왜 '정확히 같다'가 위험해질 수 있는지까지 한 편에서 묶어 정리합니다.
- 왜 실수는 정수보다 표현이 더 까다로운지
- fixed-point와 floating-point의 발상 차이
- 0.1을 2진수로 바꾸면 왜 반복이 생기는지
- 부동소수점의 부호, 지수, 유효숫자 구조를 큰 그림으로 이해하기
- 실수 비교에서 오차 허용 범위를 생각해야 하는 이유
1. 실수 저장이 어려운 이유는 값 후보가 너무 촘촘하기 때문이다
정수는 칸칸이 떨어진 눈금처럼 생각할 수 있지만, 실수는 그 사이에도 값이 계속 들어갑니다. 그래서 유한한 비트 수로 모든 실수를 정확히 담는 방식은 만들 수 없습니다.
중요한 건 컴퓨터가 실수를 틀리게 다루는 것이 아니라, 애초에 표현 가능한 후보 중 가장 가까운 값을 고르는 구조라는 점입니다.
| 대상 | 표현 감각 | 결과 |
|---|---|---|
| 정수 | 떨어진 칸 중 하나를 선택 | 상대적으로 정확하게 저장되기 쉽다 |
| 실수 | 끝없이 촘촘한 선 위의 점을 근사 | 반올림과 근사가 필수로 들어간다 |
2. fixed-point는 단순하지만 범위와 유연성이 작다
fixed-point는 소수점 위치를 미리 약속해 두는 방식입니다. 해석은 단순하지만 아주 큰 수와 아주 작은 수를 동시에 유연하게 담기 어렵습니다.
그래서 fixed-point는 개념 이해에는 좋지만, 넓은 범위의 실수를 일반적으로 다루는 데는 한계가 있습니다.
| 장점 | 한계 |
|---|---|
| 해석이 단순하고 일정하다 | 넓은 범위와 높은 정밀도를 동시에 잡기 어렵다 |
3. floating-point는 소수점 위치를 지수로 움직이게 만든다
floating-point의 핵심은 소수점 위치를 고정하지 않고 지수(exponent)로 조절한다는 점입니다. 그래서 크기가 매우 다른 값을 한 형식 안에서 어느 정도 함께 다룰 수 있습니다.
대신 표현 구조가 더 복잡해지고, 근사와 반올림을 받아들여야 합니다.
| 구성 요소 | 무슨 역할을 하나 |
|---|---|
| sign | 양수인지 음수인지 표시 |
| exponent | 소수점 위치를 얼마나 움직일지 결정 |
| significand/fraction | 실제 자릿수 정보를 주로 담음 |
4. 왜 0.1은 2진수에서 끝나지 않을까
10진수에서 1/3이 0.333... 으로 끝나지 않는 것처럼, 2진수에서는 0.1이 반복 패턴을 만듭니다. 그래서 컴퓨터는 그 긴 패턴을 어느 지점에서 잘라 근사값으로 저장할 수밖에 없습니다.
| 단계 | 값 × 2 | 정수부 | 다음 소수부 |
|---|---|---|---|
| 1 | 0.1 × 2 = 0.2 | 0 | 0.2 |
| 2 | 0.2 × 2 = 0.4 | 0 | 0.4 |
| 3 | 0.4 × 2 = 0.8 | 0 | 0.8 |
| 4 | 0.8 × 2 = 1.6 | 1 | 0.6 |
| 5 | 0.6 × 2 = 1.2 | 1 | 0.2 |
5. 그래서 0.1 + 0.2가 0.3과 딱 같지 않을 수 있다
사람이 기대하는 계산은 정확한 0.1 + 정확한 0.2 입니다. 하지만 컴퓨터 내부에서는 이미 저장 단계에서 각 값이 가장 가까운 근사값이므로, 결과도 0.3 근처의 근사값이 될 수 있습니다.
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. 직접 해볼 문제: 어떤 비교가 더 안전할까
이 문제는 부동소수점을 암기 대상이 아니라 사용 규칙으로 이해했는지 보는 데 목적이 있습니다.
이번 글에서 기억할 것
스스로 점검
다음 글 예고
다음 글에서는 값의 표현에서 한 단계 더 내려가, 논리 게이트와 회로에서 CPU까지 이어지는 하드웨어 쪽 큰 그림으로 넘어갑니다.
'학습 자료 글 > 컴퓨터시스템' 카테고리의 다른 글
| 컴퓨터시스템 기초 9. CPU는 명령을 어떤 단계로 실행할까 (0) | 2026.03.31 |
|---|---|
| 컴퓨터시스템 기초 8. 논리 게이트에서 CPU까지 어떤 연결이 생길까 (0) | 2026.03.31 |
| 컴퓨터시스템 기초 6. 바이트 순서는 왜 값을 다르게 보이게 만들까 (0) | 2026.03.31 |
| 컴퓨터시스템 기초 5. 데이터는 왜 결국 비트로 표현될까 (0) | 2026.03.31 |
| 컴퓨터시스템 기초 4. 디버거는 실행을 보는 창이다 (0) | 2026.03.31 |