이번 문서의 목표: 이 문서를 다 읽으면 실수를 과학적 표기법으로 바꾸고, 가수와 지수라는 두 부분으로 나누어 표현하는 이유를 설명하고, 왜 컴퓨터가 어떤 소수를 정확히 표현하지 못하는지 직관적으로 이해할 수 있다.
왜 실수는 정수보다 표현이 까다로운가
01편에서 배운 진법 변환은 모두 정수(integer, 소수점이 없는 수)를 다뤘다. 그런데 실제 계산에서는 3.14, 0.001, 6500000처럼 소수점이 있거나 아주 크거나 아주 작은 수, 즉 실수(real number)를 다뤄야 하는 경우가 훨씬 많다.
정수는 비트 수만 늘리면 표현할 수 있는 범위가 커지는 비교적 단순한 문제다. 하지만 실수는 두 가지 어려움이 동시에 있다. 첫째, 아주 큰 수(예: 우주의 별 개수)와 아주 작은 수(예: 원자 하나의 질량)를 같은 비트 수 안에서 모두 표현할 방법이 필요하다. 둘째, 소수점 아래로 무한히 이어질 수 있는 값(예: )을 유한한 비트로 어딘가에서 잘라야 한다. 이 두 어려움을 동시에 해결하기 위해 고안된 표현 방식이 부동소수점(floating-point, 소수점이 고정되지 않고 떠다닌다는 뜻)이다.
쉽게 말하면: 부동소수점은 “소수점의 위치를 고정하지 않고, 필요에 따라 이리저리 옮길 수 있게” 실수를 표현하는 방법이다.
이 문서는 부동소수점을 이해하기 위한 사전 개념(가수·지수·과학적 표기법·반올림·오차 직관)만 다룬다. 실제로 컴퓨터가 실수를 몇 비트로, 어떤 순서로 저장하는지에 대한 국제 표준(IEEE 754)의 세부 규격은 08편(자료의 표현: 부동소수점·문자코드·오류검출)에서 본격적으로 다룬다. 여기서는 그 표준을 이해하기 위한 기초 체력을 만든다는 감각으로 접근하면 된다.
과학적 표기법 복습
과학적 표기법(scientific notation)은 아주 크거나 아주 작은 수를 “0이 아닌 한 자리 숫자와 소수점 이하 부분” 곱하기 “10의 거듭제곱”의 형태로 나타내는 표기법이다. 예를 들어 지구에서 태양까지의 거리는 약 150,000,000킬로미터인데, 이를 과학적 표기법으로 쓰면 다음과 같다.
- : 소수점 앞에 0이 아닌 한 자리 숫자만 남도록 소수점을 옮긴 부분. 이를 유효숫자(significant digits) 또는 가수(mantissa, 만티사)라고 부른다.
- : 원래 소수점 위치에서 몇 자리를 옮겼는지를 나타내는 부분. 이 거듭제곱의 지수 8을 지수(exponent)라고 부른다.
아주 작은 수도 같은 방식으로 쓴다. 예를 들어 0.000045를 과학적 표기법으로 바꾸면 소수점을 오른쪽으로 5칸 옮겨 가 된다. 지수가 음수라는 것은 “원래 수가 1보다 작다(소수점을 오른쪽으로 옮겨서 앞자리를 만들었다)“는 뜻이다.
쉽게 말하면: 과학적 표기법은 숫자를 “의미 있는 자릿수(가수)“와 “소수점을 얼마나 옮겼는지(지수)” 두 부분으로 쪼개 쓰는 방법이다.
가수와 지수 — 부동소수점의 두 기둥
부동소수점 표현은 이 과학적 표기법의 아이디어를 2진법으로 그대로 옮긴 것이다. 다만 10진법의 10 대신 2진법의 2를 기준으로 삼는다. 임의의 2진 실수는 다음과 같은 형태로 나타낼 수 있다.
- 가수(mantissa, 유효숫자부): 값의 의미 있는 자릿수를 담는 부분. 부동소수점에서는 보통 정수 부분이 1이 되도록 소수점을 옮긴 형태(예: )로 맞추는데, 이를 정규화(normalization)라고 한다.
- 지수(exponent, 지수부): 소수점을 몇 자리 옮겼는지, 즉 2의 몇 제곱을 곱해야 원래 값이 되는지를 나타내는 부분.
예를 들어 10진수 5.75를 2진수로 바꿔서 정규화해 보자. 5.75는 정수 부분 5와 소수 부분 0.75로 나뉜다. 5는 2진수로 101이고, 0.75는 이므로 2진 소수로 0.11이다. 합치면 5.75는 2진수로 101.11이다.
이제 정규화한다. 소수점을 왼쪽으로 2칸 옮겨서 정수 부분이 1자리(1)만 남게 만든다.
- 가수:
1.0111(정수 부분이 1로 정규화된 형태) - 지수:
2(소수점을 왼쪽으로 2칸 옮겼다는 뜻)
검산해 보면, 는 소수점을 오른쪽으로 2칸 다시 옮기는 것과 같으므로 101.11이 되어 원래 값과 일치한다.
자주 틀리는 점: 정규화할 때 “정수 부분이 1자리만 남도록” 만든다는 규칙을 놓치고, 아무 위치에서나 소수점을 옮겨 지수를 계산하는 실수가 잦다. 정규화된 형태는 항상 꼴이어야 한다.
가수와 지수를 나눠 저장하는 방식 덕분에, 아주 큰 수는 지수를 크게, 아주 작은 수는 지수를 작게(음수로) 만들어서 같은 자릿수(가수의 길이)로도 훨씬 넓은 범위의 값을 표현할 수 있다. 이것이 부동소수점이 정수 표현보다 훨씬 넓은 범위의 값을 다룰 수 있는 핵심 원리다.
반올림 — 유한한 자릿수의 대가
가수는 항상 정해진 자릿수만 저장할 수 있다. 그런데 어떤 값은 2진법으로 정확히 표현하면 무한히 반복되는 소수가 되기도 한다. 대표적인 예가 10진수 0.1이다.
10진법에서 이 끝나지 않는 것처럼, 2진법에서는 0.1처럼 우리에게 “딱 떨어져 보이는” 10진 소수도 끝나지 않을 수 있다. 이는 0.1이 2의 거듭제곱들의 합으로는 정확히 나누어떨어지지 않기 때문이다(10진법에서 이 2와 5의 거듭제곱으로 나누어떨어지지 않는 것과 같은 이유다).
가수의 자릿수가 유한하므로, 컴퓨터는 이 무한히 이어지는 값을 정해진 자리에서 자르거나 반올림해서 저장할 수밖에 없다. 이때 생기는 아주 작은 차이를 반올림 오차(rounding error) 또는 표현 오차(representation error)라고 부른다.
간단한 비유로 이해해 보자. 자를 사용해 길이를 잴 때, 자에 밀리미터(mm) 눈금까지만 있다면 그보다 더 미세한 차이는 반올림해서 읽을 수밖에 없다. 부동소수점의 가수 자릿수도 이 눈금 간격과 같은 역할을 한다. 눈금이 촘촘할수록(가수 자릿수가 많을수록) 더 정밀하게 잴 수 있지만, 아무리 촘촘해도 무한히 이어지는 값을 완벽히 담을 수는 없다.
쉽게 말하면: 컴퓨터는 무한히 이어지는 소수를 유한한 자릿수 안에 억지로 담아야 하므로, 아주 작은 오차가 항상 생길 수 있다는 것을 전제로 계산해야 한다.
이 반올림 오차 때문에 프로그램에서 0.1 + 0.2를 계산하면 정확히 0.3이 아니라 0.30000000000000004처럼 눈에 보이는 오차가 나오는 현상이 실제로 발생한다. 이는 프로그램의 버그가 아니라 부동소수점 표현 방식 자체의 근본적인 한계이며, 독학사 시험에서도 “부동소수점 연산이 정수 연산과 달리 오차를 가질 수 있는 이유”를 묻는 개념형 문항으로 자주 다뤄진다.
표현 범위와 오차의 직관
부동소수점의 표현 범위는 지수부가 얼마나 큰 값과 작은 값을 가질 수 있느냐에 따라 정해지고, 정밀도(precision, 얼마나 세밀하게 값을 구별할 수 있는가)는 가수부의 자릿수에 따라 정해진다. 이 둘은 서로 다른 성격의 한계라는 점이 중요하다.
| 구분 | 결정 요소 | 부족하면 생기는 문제 |
|---|---|---|
| 표현 가능한 범위 | 지수부의 자릿수(비트 수) | 너무 크거나 작은 값을 담지 못해 오버플로·언더플로 발생 |
| 표현 정밀도 | 가수부의 자릿수(비트 수) | 비슷한 크기의 값들을 서로 구별하지 못하거나 반올림 오차 증가 |
여기서 오버플로(overflow)는 표현할 수 있는 최댓값을 넘어서는 상황을, 아직 이 문서에서 다루지 않은 언더플로(underflow)는 0에 너무 가까워 표현 가능한 최솟값보다 작아지는 상황을 가리킨다. 정수의 오버플로는 07편(자료의 표현: 정수·보수·오버플로)에서 보수 연산과 함께 자세히 다루고, 부동소수점의 오버플로·언더플로와 실제 비트 배치는 08편에서 이어서 다룬다.
지금 단계에서 꼭 잡아야 할 직관은 다음 두 가지다.
- 가수 자릿수가 늘어나면 정밀도가 좋아진다(더 세밀한 값 차이를 구별할 수 있다). 하지만 표현 가능한 값의 범위가 넓어지는 것은 아니다.
- 지수 자릿수가 늘어나면 표현 가능한 값의 범위(얼마나 크거나 작은 수까지 다룰 수 있는가)가 넓어진다. 하지만 각 값의 정밀도가 좋아지는 것은 아니다.
이 둘을 같은 것으로 착각하면 “비트 수를 늘리면 오차가 항상 줄어든다”는 잘못된 결론에 이르기 쉽다. 실제로는 늘어난 비트를 가수에 쓰느냐 지수에 쓰느냐에 따라 개선되는 성질이 다르다.
자주 틀리는 점
- 가수와 지수의 역할을 반대로 아는 실수: 가수는 “의미 있는 자릿수(정밀도)”, 지수는 “값의 크기(범위)“를 담당한다. 이 역할을 바꿔 알면 정규화 계산 자체가 틀어진다.
- 정규화된 가수의 정수 부분이 1이 아니어도 된다고 착각하는 실수: 정규화된 2진 부동소수점 표현은 항상 꼴이어야 한다.
- 10진 소수는 항상 2진법으로 정확히 표현된다고 오해하는 실수: 0.5, 0.25처럼 2의 거듭제곱의 합으로 나타나는 값은 정확히 표현되지만, 0.1처럼 그렇지 않은 값은 무한 반복 2진 소수가 되어 반올림 오차가 생긴다.
- 비트 수를 늘리면 범위와 정밀도가 동시에 무조건 좋아진다고 생각하는 실수: 늘어난 비트를 지수부에 배정하면 범위가, 가수부에 배정하면 정밀도가 좋아지는 것이지 자동으로 둘 다 좋아지지 않는다.
핵심 정리
- 부동소수점은 실수를 “가수(의미 있는 자릿수) × 2의 지수제곱” 형태로, 소수점 위치를 고정하지 않고 표현하는 방식이다.
- 과학적 표기법의 원리를 2진법에 적용한 것이 부동소수점의 기본 아이디어이며, 정규화는 가수의 정수 부분이 1이 되도록 소수점을 옮기는 과정이다.
- 가수의 자릿수는 유한하므로, 2진법으로 정확히 나누어떨어지지 않는 값(예: 0.1)은 반올림 오차를 피할 수 없다.
- 지수부는 표현 범위(오버플로·언더플로 관련)를, 가수부는 표현 정밀도(반올림 오차 관련)를 결정하며 이 둘은 서로 다른 성질이다.
- 실제 비트 배치와 IEEE 754 표준의 세부 규격은 08편에서 다룬다.
마무리 복습
참고 자료
- IEEE Standards Association — 부동소수점 표현의 원전 표준인 IEEE 754-2019 규격 자료.
- 국가평생교육진흥원 독학학위제 — 독학사 시험 안내 및 평가영역 공식 자료.