고정 소수점 (Fixed Point Number)
고정 소수점은 소수점의 위치를 미리 정해 두고 실수를 표현하는 방식이다.
오늘날에는 부동 소수점이 주로 쓰이지만, 고정 소수점을 알아 두면 부동 소수점을 이해하는 데 도움이 된다.
부호가 있는 8비트 고정 소수점을 살펴보자.
최상위 1비트는 부호 비트로 쓰고, 남은 7비트를 정수부와 소수부에 나누어 할당해야 한다.
언어나 라이브러리에 따라 이 비트 배치가 미리 정해져 있기도 하지만,
COBOL처럼 사용자가 정수부와 소수부의 자릿수를 직접 지정할 수 있는 언어도 있다.
01 AMOUNT PIC S9(5)V9(2).
PIC은 데이터의 모양과 자릿수를 지정하는 PICTURE 절의 약자다.
S는 부호가 있는 수임을 뜻한다.
9는 숫자 한 자리를 뜻하고, 괄호 안의 숫자는 반복 횟수를 나타낸다.
V는 저장 공간을 차지하지 않는 묵시적 소수점의 위치를 나타낸다.
따라서 S9(5)V9(2)은 부호 1자리, 정수부 5자리, 소수부 2자리로 구성된 수를 뜻한다.
여기서는 정수부에 4비트, 소수부에 3비트를 할당하겠다.
| 부호 비트 (1비트) | 정수부 (4비트) | 소수부 (3비트) |
|---|---|---|
| x | xxxx | xxx |
비트 패턴 자체에는 소수점의 위치를 기록하지 않는다.
대신 이 값을 처리하는 하드웨어나 소프트웨어는 미리 정한 형식에 따라 비트 패턴의 각 부분을 부호 비트, 정수부, 소수부로 해석한다.
부호 비트를 제외한 7비트를 정수부 5비트와 소수부 2비트로 나눌 수도 있다.
이처럼 전체 비트 수가 같아도 정수부와 소수부에 할당한 비트 수가 다를 수 있으므로, 이 비트 배치를 나타내는 표기법이 필요하다.
Qm.n에서 m은 정수부 비트 수, n은 소수부 비트 수를 뜻한다.
따라서 이 표가 나타내는 형식은 정수부 4비트와 소수부 3비트로 구성된 Q4.3이다.
우리가 만든 이 형식에 를 넣어 보자.
를 2진수로 바꾸면 이다.
이를 Q4.3 형식에 넣으면 0 | 1100 | 101이 되며, 양수 부호까지 포함해 정확하게 저장할 수 있다.
반면 는 이다.
정수부 는 7비트이므로 정수부에 넣을 수 없고, 소수부 0101도 4비트이므로 넣을 수 없다.
이처럼 고정 소수점은 정수부와 소수부에 쓸 비트 수를 미리 나누므로 표현할 수 있는 값의 범위가 제한된다.
대신 표현할 수 있는 범위의 값은 오차 없이 정확하게 표현할 수 있다.
데이터의 범위와 필요한 정밀도를 고려해 정수부와 소수부에 할당할 비트 수를 정해야 한다.
예를 들어 32비트에서는 부호 비트 1개, 정수부 15비트, 소수부 16비트로 구성된 Q15.16 형식을 사용할 수 있다.
정수부가 필요 없고 소수부의 정밀도가 중요하다면, 부호 비트 1개와 소수부 31비트로 구성된 Q0.31 형식을 사용할 수도 있다.