Post

Lecture 04: Floating Point

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

ValueRepresentation
$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}$ 형태로 표현할 수 없는 유리수는 순환소수 형태로 나타난다.

    ValueRepresentation
    $\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) 등으로 형식을 정의하고 있다. 각 정밀도 형식은 다음과 같이 구성된다. (단위: 비트)

PrecisionSignExponentMantissa
단정밀도1823
배정밀도11152

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 ~ 1271 ~ 254
배정밀도1023-1022 ~ 10231 ~ 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을 부동 소수점 방식으로 표현해 보자.

\[\begin{align*} 15213_{10} &= 11101101101101_2 \\[2pt] &= 1.1101101101101_2 \times 2^{13} \\[2pt] &= (-1)^S \times M \times 2^E \end{align*}\]

따라서 $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거짓


References


이 게시물은 저작자의 CC BY-SA 4.0 라이선스를 따릅니다.

인기 태그