본문 바로가기

정수·부호·고정소수점·부동소수점

잔액은 음수가 될 수 있고, 금액에는 소수점 이하 자리가 필요하며, 센서값은 매우 크거나 매우 작을 수 있다. 컴퓨터는 제한된 비트 안에 이 값을 넣어야 한다. 어떤 비트를 부호·정수부·소수부·지수에 나눠 주느냐에 따라 표현 범위와 정밀도가 달라진다.

숫자가 같아 보여도 계산 결과가 다른 이유

잔액은 음수가 될 수 있고, 금액에는 소수점 이하 자리가 필요하며, 센서값은 매우 크거나 매우 작을 수 있다. 컴퓨터는 제한된 비트 안에 이 값을 넣어야 한다. 어떤 비트를 부호·정수부·소수부·지수에 나눠 주느냐에 따라 표현 범위와 정밀도가 달라진다.

숫자 형식은 단순 저장법이 아니다. 범위를 넘으면 값이 돌아가거나 오류가 나고, 소수 계산에는 근사 오차가 생긴다. 그러므로 업무의 허용 범위와 오차를 먼저 정한 뒤 표현 방식을 골라야 한다.

먼저 되짚기: 비트열에는 자릿값 규칙이 필요하다

앞 절에서 저장 비트의 해석과 같은 수의 진법 표기를 구별했다. 이번에는 제한된 자릿값 일부를 음수와 소수에 배분한다. 비트 자체가 음수나 소수인 것이 아니라 해석 규칙이 비트 자리에 역할을 부여한다.

제한된 비트를 어디에 배분할지 정한다

유한 비트의 역할 배분으로 숫자 형식을 나눈다

상자 안의 대상과 화살표의 조건을 함께 읽으세요. 좁은 화면에서는 같은 관계를 세로로 재배치한 도식을 보여 줍니다.

유한 비트의 역할 배분으로 숫자 형식을 나눈다유한 비트를 2의 보수 같은 부호 있는 정수 규칙으로 읽으면 부호 있는 정수, 미리 정한 배율의 정수로 읽으면 고정소수점, 부호·유효숫자·지수로 나누면 부동소수점이다. 선택은 필요한 값 범위와 정확도·허용 오차 계약에서 시작한다.bits → integerbits → fixedbits → float유한 비트: 범위·정확도·오차 계약유한 비트범위·정확도·오차 계약부호 있는 정수: 2의 보수 정수값부호 있는 정수2의 보수 정수값고정소수점: 정한 배율의 정수고정소수점정한 배율의 정수부동소수점: 부호·유효숫자·지수부동소수점부호·유효숫자·지수
유한 비트의 역할 배분으로 숫자 형식을 나눈다유한 비트를 2의 보수 같은 부호 있는 정수 규칙으로 읽으면 부호 있는 정수, 미리 정한 배율의 정수로 읽으면 고정소수점, 부호·유효숫자·지수로 나누면 부동소수점이다. 선택은 필요한 값 범위와 정확도·허용 오차 계약에서 시작한다.bits → integerbits → fixedbits → float유한 비트: 범위·정확도·오차 계약유한 비트범위·정확도·오차계약부호 있는 정수: 2의 보수 정수값부호 있는 정수2의 보수 정수값고정소수점: 정한 배율의 정수고정소수점정한 배율의 정수부동소수점: 부호·유효숫자·지수부동소수점부호·유효숫자·지수

유한 비트를 2의 보수 같은 부호 있는 정수 규칙으로 읽으면 부호 있는 정수, 미리 정한 배율의 정수로 읽으면 고정소수점, 부호·유효숫자·지수로 나누면 부동소수점이다. 선택은 필요한 값 범위와 정확도·허용 오차 계약에서 시작한다.

선택은 값의 범위와 필요한 정확도·오차 계약에서 시작한다.

부호 있는 정수

부호 있는 정수는 양수와 음수를 제한된 비트로 표현하는 규칙이다. 널리 쓰이는 2의 보수 방식에서 n비트 범위는 -2^(n-1)부터 2^(n-1)-1까지다. 가장 왼쪽 비트의 자릿값을 음의 값으로 두면 같은 덧셈 회로로 양수와 음수를 계산할 수 있다.

괄호의 n-1은 전체 비트 수에서 하나를 뺀 수이며, -2^(n-1)은 그 횟수만큼 2를 곱한 뒤 음수로 읽는다. 8비트라면 n-1=7, 2⁷=128이므로 최솟값은 -128, 최댓값은 128-1=127이다. 음수 128개와 0을 포함한 비음수 128개를 합쳐 앞 절에서 센 256개 조합을 사용한다.

부동소수점

부동소수점(floating point)은 부호·유효숫자·지수로 넓은 범위의 근삿값을 표현하는 방식이다. 과학 표기 6.02 × 10^23처럼 유효숫자와 자릿수 크기를 나눠 저장한다. 제한된 유효숫자 때문에 모든 실수를 정확히 담을 수 없고, 표현 범위 안에서도 선택한 반올림 규칙에 따라 표현 가능한 값으로 근사한다. 가장 가까운 값 선택뿐 아니라 0 방향이나 위·아래 방향을 고르는 규칙도 있으므로, 여기의 근사 오차 설명을 모든 구현의 한 가지 반올림 방식으로 단정하지 않는다.

예를 들어 123.45 = 1.2345×10²는 1.2345에 100을 곱하라는 뜻이다. 앞의 1.2345가 중요한 숫자를 모은 유효숫자 부분(가수)이고 2가 크기를 정하는 지수다. 10⁻²는 100의 역수인 0.01이므로 음의 지수로 작은 수도 표현한다. 실제 이진 부동소수점은 10 대신 2를 기준으로 같은 방식의 크기 조절을 한다. 이 표기는 값의 크기를 조절하는 규칙이지 소수점 아래 자릿수를 무제한 저장하는 방법이 아니다.

고정소수점은 소수점 위치를 미리 고정하는 방식이다. 예를 들어 정수 12345를 소수 둘째 자리까지의 금액으로 약속하면 123.45로 읽는다. 범위는 좁아지지만 정해진 자릿수의 계산을 예측하기 쉽다.

제한된 비트를 나누어 쓰는 방법

8비트 2의 보수에서 00000101은 5다. -5는 모든 비트를 뒤집고 1을 더한 11111011로 표현한다. 5 + (-5)를 8비트 덧셈하면 자리 넘침을 버린 결과가 00000000이 된다. 8비트 범위는 -128~127이므로 127에 1을 더하는 연산은 이 범위를 벗어난다.

중간값을 쓰면 00000101 → 11111010(0과 1을 뒤집음) → 11111011(1을 더함)이다. 해석할 때 왼쪽부터 자릿값은 -128, 64, 32, 16, 8, 4, 2, 1이므로 11111011은 -128+64+32+16+8+0+2+1=-5가 된다. 앞 절의 부호 없는 해석이라면 같은 비트열은 251이므로 해석 계약을 반드시 붙인다. 두 비트열의 덧셈은 00000101+11111011=1 00000000이며 맨 왼쪽의 아홉 번째 자리는 이 8비트 예에서는 버려 0을 얻는다. 범위를 벗어난 계산을 실제 언어가 이렇게 처리한다는 보장은 아래에서 따로 구분한다.

소수 0.1은 십진법에서는 짧지만 이진법에서는 유한한 자리로 끝나지 않는다. 부동소수점은 가까운 비트 패턴을 저장하므로 0.1 + 0.2가 수학적 0.3과 내부적으로 정확히 같지 않을 수 있다. 화면에 표시할 때 반올림되어 같아 보일 뿐이다.

왜 끝나지 않는지 보려면 이진 소수의 자릿값을 읽는다. 점 오른쪽은 차례로 1/2, 1/4, 1/8, …이며 0.101₂는 1/2+0/4+1/8=0.625다. 0.1을 이진 소수로 바꿀 때 남은 소수에 2를 곱하고 정수 부분을 다음 비트로 떼어 낸다. 0.1×2=0.2에서 0, 0.2×2=0.4에서 0, 0.4×2=0.8에서 0, 0.8×2=1.6에서 1을 얻고 0.6이 남는다. 이어 0.6×2=1.2에서 1을 떼면 다시 0.2가 남아 같은 단계가 반복된다. 따라서 0.000110011…₂를 끝까지 저장할 수 없어 정해진 비트 수에서 반올림한다.

근삿값 비교도 같은 가정을 써야 한다. 교육용 온도 측정에서 허용 차이를 0.01도라고 정했다면 20.000도와 20.006도의 차이 0.006도는 허용하고, 20.000도와 20.020도의 차이 0.020도는 허용하지 않는다. “항상 같음으로 비교하지 않는다”만 외우지 말고 무엇을 재며 얼마의 차이가 허용되는지 함께 정한다.

세 숫자 형식의 비교표에서 같은 비트 예산의 대가를 대조한다. 정수 자리에 사용하면 정수 범위 또는 부호 표현을 얻고, 고정 소수 자리에 사용하면 정해진 자릿수에서 예측 가능한 계산을 얻는다. 유효숫자·지수에 사용하면 매우 넓은 범위를 얻는 대신 근사 오차를 감수한다.

NR-1: 경계값·금액·근삿값을 같은 숫자로 취급하지 않는다

8비트 2의 보수 정수의 범위는 -128~127이다. 따라서 127에 1을 더한 수학적 결과 128은 이 형식의 표현범위 밖이다. 실제 언어나 명령이 overflow를 어떻게 처리하는지는 별도 계약이다.

금액 123.45원을 소수 둘째 자리까지의 고정 배율 정수로 저장한다고 가정하면 저장값은 12345이고 복원은 12345/100=123.45다. 배율 100이라는 계약을 잃으면 같은 정수 12345를 다른 금액으로 읽을 수 있다.

십진수 0.1은 유한 이진 소수로 끝나지 않으므로 일반적인 유한 부동소수점에서는 근삿값으로 저장된다. 따라서 금액의 정확한 최소 화폐단위 계산과 넓은 범위의 측정값 계산은 같은 정답 판정 기준을 쓰지 않는다. 앞의 고정 배율로 123.45원과 0.55원을 더하면 저장값은 12345+55=12400, 복원한 금액은 12400/100=124.00원이다. 곱셈·나눗셈 때문에 둘째 자리보다 작은 금액이 생기면 언제 어느 방향으로 반올림할지 별도로 정해야 한다.

무엇을 고를 것인가

방식강점대가적합한 예
부호 있는 정수정확하고 빠른 정수 계산소수 불가, 범위 제한수량·순번·횟수
고정소수점정한 소수 자릿수에서 예측 가능범위와 자릿수를 미리 정함금액·세율 계산
부동소수점아주 크고 작은 값을 함께 표현반올림·비교 오차과학계산·측정값·그래픽

판단 순서는 필요 범위 → 필요한 최소 자릿수 → 허용 오차 → 연산 종류 → 저장·처리비용이다. 금액처럼 한 단위의 손실도 허용하기 어렵다면 최소 화폐단위를 정수로 저장하거나 정밀 십진 방식을 쓴다. 측정값처럼 본래 오차가 있고 범위가 넓다면 부동소수점이 자연스럽다.

실패조건과 방어

오버플로는 계산 결과가 표현 범위를 벗어나는 현상이다. 입력과 중간 결과의 최댓값을 계산하고, 더 넓은 형식이나 범위 검사를 둔다.

정밀도 손실은 큰 값과 매우 작은 값을 더하거나 반복 계산할 때 작은 차이가 사라지는 현상이다. 계산 순서와 허용 오차를 정하고 결과를 검증한다.

근삿값의 정확한 동등 비교는 서로 다른 계산에서 생긴 반올림 차이 때문에 기대와 다른 결과를 낼 수 있다. 수치의 동등 비교와 저장 비트의 일치는 같은 규칙이 아니다. 예를 들어 Java의 +0.0 == -0.0은 참이지만 두 값의 부호 비트는 다르다. 측정·계산한 근삿값에는 업무의 단위·값의 크기·허용 오차에 맞는 절대 또는 상대 오차 기준을 정한다. 정확한 수량·식별값 비교까지 일괄적으로 오차 비교로 바꾸지는 않는다.

단위 누락은 100이 원인지 센트인지, 0.15인지 15%인지 알 수 없게 한다. 값과 함께 단위·배율·반올림 규칙을 계약으로 둔다.

자체 10점 문제

정수·고정소수점·부동소수점 표현을 비교하고 선택기준을 제시하시오.

요구어는 비교, 제시다. 범위·정확도·오차·단위와 실제 선택 이유를 연결한다.

10점 풀이 방향과 모범답안 보기

10점 답안 목차

  1. 부호 있는 정수의 범위
  2. 고정소수점의 배율
  3. 부동소수점의 넓은 범위와 근사
  4. 금액·측정값의 선택 기준
  5. overflow·반올림·단위 실패

10점 답안 도식

범위·정확도·단위를 먼저 정하고 숫자 형식의 비교와 선택으로 정수·고정소수점·부동소수점 중 적합한 계약을 고른다. 선택 뒤에는 경계값·허용 오차·반올림 규칙을 검증한다.

모범답안 축약본: 범위와 정확도를 분리해 형식을 고른다

문제: 정수·고정소수점·부동소수점 표현을 비교하고 선택기준을 제시하시오. n비트 부호 있는 정수는 음수와 양수를 유한 범위에 정확히 표현하지만 범위를 넘으면 오버플로가 난다. 고정소수점은 정한 배율의 정수로 값을 저장해 금액처럼 소수 자릿수와 반올림 규칙이 고정된 업무에 유리하다. 부동소수점은 부호·가수·지수로 넓은 크기 범위를 표현하지만 많은 10진 소수를 이진수로 정확히 담지 못해 근사 오차가 생긴다. 선택은 값의 최솟값·최댓값, 필요한 유효자릿수, 허용 오차, 연산 종류와 단위로 판단한다. 금액 합계에는 통화 최소단위 정수나 고정소수점을 쓰고, 과학 측정에는 부동소수점과 오차 한계를 쓸 수 있다. 근삿값을 정확한 동등식으로 비교하거나 단위·배율·반올림 시점을 생략하지 말고, 경계값과 반복 계산에서 범위 및 오차를 검증한다.

출처와 적용 경계

본문은 유한 비트 수 표현의 안정된 기초와 자체 계산을 사용한다. 이진 부동소수점의 0.1 근사는 Python 공식 Tutorial §15, 반올림 방향의 구분은 Oracle Numerical Computation Guide, Chapter 2의 IEEE Arithmetic Model에서 확인할 수 있다. Oracle 자료는 IEEE 754-1985의 설명이며 최신 판 전체나 모든 언어의 선택 가능 모드를 대신하지 않는다. 수치 동등성과 저장 비트의 차이를 보이는 부호 있는 0의 예는 Java 언어 명세 §4.2.3의 Java 규칙이다. 이를 모든 언어의 모든 비교 API에 그대로 적용하지 않는다. 구체 언어의 overflow·십진형·부동소수점 예외 처리 방식은 해당 언어와 플랫폼 사양을 확인하며, NR-1은 특정 구현 결과를 보장하지 않는다.

30초 정리

  1. 부호 있는 정수는 제한된 비트로 양수와 음수를 표현하며 반드시 범위가 있다.
  2. 고정소수점은 정한 배율의 값을 정확히 다루되 배율보다 작은 결과의 반올림을 정한다. 부동소수점은 넓은 범위를 얻지만 많은 십진 소수를 근사한다.
  3. 숫자 형식은 범위·자릿수·허용 오차·단위·연산을 함께 보고 선택한다.

자기교정과 조건 변경

잘못 쓴 답왜 틀렸는가고쳐 쓸 내용복습
8비트 signed는 -128~128이다가능한 값이 257개가 된다-128~127이다NR-1
127+1은 그냥 128로 저장된다형식의 범위를 넘는다overflow 처리 계약을 확인한다NR-1
12345는 언제나 123.45원이다배율과 단위를 생략했다배율 100·원 단위를 함께 명시한다NR-1
0.1은 컴퓨터에서도 정확한 이진 소수다유한 이진수로 끝나지 않는다부동소수점 근삿값과 허용오차를 둔다근사
부동소수점이 범위가 넓으니 금액에도 항상 최선이다정확 자릿수 요구를 무시했다업무의 범위·정확도·반올림 요구로 고른다선택

16비트 signed로 넓히면? 범위는 -32768~32767로 넓어지지만 소수 자릿수가 자동으로 생기지는 않는다.

금액을 천분의 일 단위까지 저장하면? 배율을 1000으로 바꾸고 범위·저장값·반올림 규칙을 다시 계산한다.

측정값이 10^-20부터 10^20까지 넓게 분포하면? 고정소수점보다 부동소수점의 넓은 동적 범위를 검토하되 요구 정밀도와 오차를 함께 정한다.