IEEE 754 부동 소수점 계산

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이다. 따라서 M0001000000... 형태로 총 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를 사용하면 더 정밀한 표현이 가능하다. 대신 더 많은 공간을 필요로 한다.