IEEE 754 부동 소수점 표현은 2진수로 부동 소수점을 표현하는 방식 중 하나이다. 대표적으로 C언어의 float와 double이 이 방식을 따른다.
- 32비트 단정밀도(single-precision)
- 64비트 배정밀도(double-precision)
2진수 변환
10진수가 10 단위로 자릿수를 올리듯이 2진수는 1, 2, 4, 8과 같이 2 단위로 자릿수를 옮긴다.
우선 우리에게 익숙한 10진수의 구성을 확인해보자. 325라는 10진수가 있다면 이 수는 아래와 같이 쪼갤 수 있다.
10진수 | 325 = 300 + 20 + 5 | ||
숫자 | 3 | 2 | 5 |
자리 | $10^2$ | $10^1$ | $10^0$ |
이러한 방식은 2진수에도 동일하게 적용된다. 다만 10 대신 2를 기준으로 한다.
2진수 | 101 | ||
숫자 | 1 | 0 | 1 |
자리 | $2^2$ | $2^1$ | $2^0$ |
10진수로 변환 | $2^2\times 1+2^1\times 0+2^0\times 1=5$ |
소수점 아래 자리는 -1, -2, -3과 같이 음수로 표현된다.
만약 $10.101_{(2)}$라는 2진수 표현이 있다면 이를 10진수로 변환하는 과정은 아래와 같다.
2진수 | 10.101 | |||||
숫자 | 1 | 0 | . | 1 | 0 | 1 |
자리 | $2^1$ | $2^0$ | $2^{-1}$ | $2^{-2}$ | $2^{-3}$ |
$2^1\times 1+2^0\times 0+2^{-1}\times 1+2^{-2}\times 0+2^{-3}\times 1 \\=2+0.5+0.125 \\=2.625$
IEEE 754 부동소수점 (32-bit)
32bit를 사용해 부동소수점을 표현하는 방식은 아래와 같다.
$N=(-1)^S\cdot 2^{E-127}\cdot (1.M)$
부호 표현 (S) | 지수표현 (E) | 가수 표현 (M) |
1bit | 8bit | 23bit |
1. 형태 변환
최종적인 목표는 $N=(-1)^S\cdot 2^{E-127}\cdot (1.M)$ 형태로 변환하는 것이다.
따라서, 소수점을 기준으로 1.xxx 형태가 되도록 자릿수를 조정한다.
예를 들어,
1101.101이라는 2진수가 있다면, 이를 $2^3\cdot 1.101101$ 형태로 변환한다.
-10.001이라는 2진수가 있다면, 이를 $-2^1\cdot 1.0001$ 형태로 변환한다.
2. S 구하기
$(-1)^1\cdot 2^1\cdot 1.0001$라면, S는 1이 된다. 쉽게 말해 음수는 1, 양수는 0이 된다.
3. E 구하기
$(-1)^1\cdot 2^1\cdot 1.0001$라면, 지수는 1이 된다. 하지만 E값은 $2^{E-127}$로 바이어스 되어 있다.
다시 말해 지수 = E - 127 로 표현된다.
즉 E = 지수 + 127 이다.
위 예시에서 지수가 1이었으므로 E값은 1+127인 128이 된다.
4. M 구하기
M은 IEEE 745 방식으로 정리했을 때, 소수점 아래의 값을 나타낸다. 그런데 M은 총 23bit를 가지므로 남는 자리는 0으로 채운다.
$(-1)^1\cdot 2^1\cdot 1.0001$라면, 소수점 아래는 0001이다. 따라서 M은 0001000000... 형태로 총 23bit를 채운다.
5. 32bit로 표현
$(-1)^1\cdot 2^1\cdot 1.0001$라면, S = 1, E = 128, M = 0001000...이 된다.
이를 2진수로 표현하면 아래와 같다.
S (1bit) | 1 |
E (8bit) | 10000000 |
M (23bit) | 00010000000000000000000 |
즉, 32bit로 표현하면 11000000000010000000000000000000이 된다.
예시: 10진수 253.625를 IEEE 754 부동 소수점 32-bit 형식으로 표현하라.
$253.625_{(10)} \\=11111101.101_{(2)} \\=(-1)^0\cdot 2^7\cdot 1.1111101101$
즉, S는 0, E는 134 (7+127), M은 1111101101...이다.
이를 2진수로 변환하면
S (1bit) | 0 |
E (8bit) | 10000110 |
M (23bit) | 11111011010000000000000 |
결과 (32bit) | 0 10000110 11111011010000000000000 |
IEEE 754 부동소수점 (64-bit)
64bit를 사용해 부동소수점을 표현하는 방식은 아래와 같다.
$N=(-1)^S\cdot 2^{E-1023}\cdot (1.M)$
부호 표현 (S) | 지수표현 (E) | 가수 표현 (M) |
1bit | 11bit | 52bit |
E값이 $2^{E-1023}$으로 바이어스 되어 있고, 사용되는 비트의 수가 다를 뿐 계산 방법은 32bit와 동일하다.
32-bit vs 64-bit
32-bit에 비해 64-bit를 사용하면 더 정밀한 표현이 가능하다. 대신 더 많은 공간을 필요로 한다.