Lecture 04: Floating Point
Computer Systems: A Programmer's Perspective (CS:APP)
Fractional Binary Numbers
앞서 $w$ 비트 정수 $x$를 각 비트 $x_i$의 합으로 나타냈었다.
\[x = \sum_{i=0}^{w-1} {x_i 2^i}\]여기서 $i$를 음수 범위로 확장하면 실수에 대한 표현과 같다.
\[x = \sum_{i=-d}^{n-1} {x_i 2^i}\]이때 $x$는 정수부 $n$ 비트, 소수부 $d$ 비트로 이루어진 실수이다.
Examples
Value | Representation |
---|---|
$5 \frac{3}{4}$ | $101.11_2$ |
$2 \frac{7}{8}$ | $10.111_2$ |
$1 \frac{7}{16}$ | $1.0111_2$ |
Limitations
$\displaystyle \frac{x}{2^k}$ 형태로 표현할 수 없는 유리수는 순환소수 형태로 나타난다.
Value Representation $\frac{1}{3}$ $0.0101010101[01]…_2$ $\frac{1}{5}$ $0.001100110011[0011]…_2$ $\frac{1}{10}$ $0.0001100110011[0011]…_2$ 전체 비트를 정수부와 실수부로 나누어 사용하기에 표현할 수 있는 수의 범위가 매우 좁다.
IEEE Floating Point
과거에는 기계마다 부동 소수점을 표현하는 방식이 달라 프로그램을 다른 기계로 옮기면 어떤 일이 일어날지 예측할 수 없었다. 이러한 혼란을 막고자 1985년 IEEE에서 부동 소수점에 대한 기술 표준(IEEE 754)을 공표하였고, 이는 오늘날까지 널리 통용되고 있다.
Floating Point Representation
부동 소수점은 실수를 과학적 표기법처럼 나타낸다.
\[(-1)^S \times M \times 2^E\]- $S$는 부호 비트, $M$은 가수, $E$는 지수이다.
- 가수 $M$은 $1 \leq M < 2$를 만족하는 분수 값이다.
Precision Options
IEEE 754는 수의 정밀도에 따라 32비트의 단정밀도(Single precision), 64비트의 배정밀도(Double precision) 등으로 형식을 정의하고 있다. 각 정밀도 형식은 다음과 같이 구성된다. (단위: 비트)
Precision | Sign | Exponent | Mantissa |
---|---|---|---|
단정밀도 | 1 | 8 | 23 |
배정밀도 | 1 | 11 | 52 |
Normalized Values
실수는 정규화 과정을 거쳐 부동 소수점 형식으로 인코딩된다. 부동 소수점의 지수부를 $\mathrm{exp}$, 가수부를 $\mathrm{frac}$이라 하자.
\[\begin{align*} \mathrm{exp} = E + \mathrm{bias} \end{align*}\]지수부가 $p$ 비트일 때, $\mathrm{bias} = 2^{p-1} - 1$이다.
Precision | $\mathrm{bias}$ | $E$ | $\mathrm{exp}$ |
---|---|---|---|
단정밀도 | 127 | -126 ~ 127 | 1 ~ 254 |
배정밀도 | 1023 | -1022 ~ 1023 | 1 ~ 2046 |
가수의 경우, $M = 1.\mathrm{xxx…x}_2$이면 $\mathrm{frac} = \mathrm{xxx…x}_2$이다.
$M$ | $\mathrm{frac}$ | |
---|---|---|
Min | $1.0$ | $000…0$ |
Max | $2.0 - \epsilon$ | $111…1$ |
가수부가 $q$ 비트일 때, $\epsilon = 2^{-q}$이다.
Normalized Encoding Example
float F = 15213.0
을 부동 소수점 방식으로 표현해 보자.
따라서 $S = 0, \, M = 1.1101101101101_2, \, E = 13$이고, 이로부터 $\mathrm{frac}$과 $\mathrm{exp}$의 값을 구할 수 있다.
\[\begin{align*} M &= 1.11011011011010000000000_2 \\[3pt] \mathrm{frac} &= \ \; \; 11011011011010000000000_2 \\[7pt] \mathrm{exp} &= E + \mathrm{bias} \\[3pt] &= 13 + 127 \\[3pt] &= 10001100_2 \end{align*}\]정리하면 다음과 같다.
$S$ | $\mathrm{exp}$ | $\mathrm{frac}$ |
---|---|---|
$0$ | $100 \; 0110 \; 0$ | $110 \; 1101 \; 1011 \; 0100 \; 0000 \; 0000$ |
즉, 15213.0
은 $0100 \; 0110 \; 0110 \; 1101 \; 1011 \; 0100 \; 0000 \;0000_2$으로 인코딩되어 메모리에 저장된다.
Denormalized Values
부동 소수점 형식에는 특수하게 처리되는 값들이 존재한다. $\mathrm{exp} = 000…0$인 경우,
\[M = 0.\mathrm{xxx...x}_2 \iff \mathrm{frac} = \mathrm{xxx...x}_2\]이는 0에 가까운 매우 작은 수들을 표현하기 위해 사용된다.
Special Values
- 모든 비트가 0인 경우, 이는 0을 나타낸다. 부호 비트에 따라 +0과 -0을 구분할 수 있다.
- $\mathrm{exp} = 111…1$이고 $\mathrm{frac} = 000…0$인 경우, $\infty$를 나타낸다. 부호 비트에 따라 $+\infty$와 $-\infty$를 구분할 수 있다.
- $\mathrm{exp} = 111…1$이고 $\mathrm{frac} \neq 000…0$인 경우, NaN(Not a Number)을 나타낸다. 음수의 제곱근 등 표현식의 결과를 실수로 나타낼 수 없을 때 사용된다.
Floating Point Puzzles
1
2
3
int x = ...;
float f = ...;
double d = ...;
다음 명제의 참/거짓을 판단해 보자.
명제 | 판단 |
---|---|
x == (int)(float)x | 거짓 |
x == (int)(double)x | 참 |
f == (float)(double)f | 참 |
d == (double)(float)d | 거짓 |
f == -(-f) | 참 |
2 / 3 == 2 / 3.0 | 거짓 |
d < 0.0 $\Rightarrow$ (d * 2) < 0.0 | 참 |
d > f $\Rightarrow$ -f > -d | 참 |
d * d >= 0.0 | 참 |
(d + f) - d == f | 거짓 |