컴퓨터로 수를 표현하는 방법은 우리가 일상에서 사용하는 표기법으로부터 나왔으며, 그 중에서도 열 손가락으로부터 비롯된 10진표기법에서 효율을 더한 방식으로 발전했다. 소수나 분수를 포함하는 실수 표기방식도 크게 다르지 않다. 정수를 표현하는 부분과 소수점 아래를 표현하는 부분을 나누어 표현해보자.
고정소수점 표현법은 소수점을 나타내는 비트와 정수를 나타내는 비트를 나누어 표현하는 방법으로, 각 자릿수가 정해져있으므로 소수점의 위치도 정해져있는 표현법이다. 정수 표현법이 일반적으로 가장 오른쪽을 1(20), 그 옆부터 차례로 21, 22, ... 으로 점점 커지는 것 처럼 소수점 아래 표현법도 마찬가지 규칙을 따른다. 소수점을 기준으로 바로 오른쪽 수는 2-1자릿수를 가리키고, 차례로 2-2, 2-3, ...을 나타낸다.
해당 방식은 0과 1이라는 두 가지 비트로 표현할 수 있는 가장 직관적인 방식일 것이다. 하지만, 실제로 잘 쓰이지 않는다. 그 이유는 실수를 표현하기 위해 드는 비트 수가 너무 많기 때문이다. 예를 들면, 100000000000000000000000이나, 0.000000000000000000000000001 같이 크기에 대한 표현만 제외하면 단순하게 표현할 수 있는 수를 표현할 때도, 2의 배수조합으로 표기하려면 상당히 복잡해지기 때문이다.
정수부와 소수부를 가리지 않고, 부호와 지수 그리고 가수의 조합으로 표현하는 방식이다. 자릿수와 소수점의 위치가 정해지지 않았다하여, 부동소수점 표현법이라고 부른다. 부호부는 정수 표현법처럼 0(양수)과 1(음수)로 표현한다. 그리고 가수와 지수가 표현하는 수를 곱하여 실수를 표기한다. 가수가 표현하는 수는 20의 자리부터 2-1, 2-2, ...으로 점점 작아지고, 지수는 1, 2, 3으로 점점 커지며, 해당 방법은 지수가 표현하는 수가 2의 지수값을 표현하므로 가수 * 2지수으로 계산된다. 따라서 큰 수나 작은 수를 표현할 때의 효율이 고정소수점에 비해 좋다.
하지만, 가수 = 2이고 지수 = 1인 경우 222=8, 가수=1 이고 지수=3인 경우 123=8, 가수=0.5 이고 지수=4인 경우 0.5*24=8이다. 중복이 많이 발생하므로 그다지 효율적이진 못하다는 의미다. 또한, 지수가 커질 수록 표현하는 수의 범위가 커져 모든 수를 표현하기 힘들다, 즉 정밀도가 떨어진다.
같은 비트 수를 활용하더라도, 기존의 이진법으로 표현한 정수보다 다양한 수를 표현할 수 있으므로 실수를 표현하는 표준 방법으로 활용된다. 수를 정밀하게 표현하긴 어렵지만, 크기 비교와 같은 연산이 빠르다는 장점이 있다.
실수를 표현할 때 가장 많이 사용하는 방식은 IEEE754이다. 전기전자기술자협회(IEEE)에서 개발한 표준 부동소수점 방식이다. 해당 방식에서도 비트그룹을 부호, 가수, 지수부분으로 나누어 해석한다. 부호는 마찬가지로 양수는 0, 음수는 1로 표현한다. 가수는 소수점을 제외한 수열을 2진법으로 구현한다.
해당 방법으로 표현된 수의 자릿수는, 가장 큰 자릿수를 1의 자리로 고정하여 해석하는데, 이 때 소수점을 이동시킨 값을 지수로 표현한다. 또한 가수부분의 MSB는 1로 고정되기 때문에 이를 생략하여 비트를 하나 더 활용하고, MSB와 인접한 비트부터 채우며 채워지지 않은 가수부분은 0으로 채워넣는다.
지수부분은 입력할 값과 bias라고 하는 편향 값을 더하여 도출된 10진수를 2진법으로 표현한 형태로 비트에 입력한다. 지수값을 그대로 사용하지 않은 이유는 가장 작은 지수값을 0의 연속으로, 가장 큰 지수값을 1의 연속으로 표현하기 위함이다. 0 즉, 소수점이동이 없는 경우는 0+1의 연속으로 표기된다.
부동소수점 수 중에 두 가지, 기본정밀도 부동소수점 수와 2배정밀도 부동소수점 수가 가장 많이 쓰인다. 기본정밀도 부동소수점 수는 32개의 비트로 표시하는 방법으로 1개의 부호비트, 8개의 지수비트, 23개의 가수비트로 구성한다. 두배정밀도 부동소수점 수는 64개의 비트로 표시하는 방법으로 1개의 부호비트, 11개의 지수비트, 52개의 가수비트로 구성된다.
기본정밀도 부동소수점 수로 -422.625를 표현해보자
- 부호는 -이므로 부호비트는 1로 표기한다.
- 가수부분은 422.625를 2진법으로 표기한 110100110.101(2)이 기재될 것이다. 기재하는 방법은 맨 앞의 1을 제외한 수열을 차례로 23개의 비트에 기재하고 남은 비트를 0으로 채워넣는 형태다. 따라서, 10100110101000000000000으로 가수비트가 기재될 것이다.
- 지수부분은 +방향으로 8번 이동하였다. 따라서 8을 표현하는 지수값을 반환해주면 되는데, 편향값이 127이므로 135의 2진수표기인 10000111이 된다. (아니면 0을 나타내는 01111111에서 00001000을 더해주는 방법으로도 찾을 수 있다.)
- 부호-지수-가수의 순서로 나열하면 1 10100110101000000000000 1000111이 된다.
10진수의 직관을 포기하고, 2진수의 효율을 살리기 위한 노력을 들여다 봤다. 하지만 비트 네 개를 묶어 하나의 10진수를 표현하도록 할 수도 있다. 이 경우 각 묶음이 각각 10의 제곱 자릿수를 하나씩 표현한다. 실수도, 정수도 효과적으로 표현할 수는 있으나 결정적으로 10진수를 표현하는 효율자체가 떨어진다는 문제가 있다. 때문에, 레거시한 방식으로 취급받고 있다.
유아독존이 아닌이상에야, 무리의 규칙을 배우자