본문으로 바로가기

IEEE 754 floating point(부동 소수점)

category System 2017. 10. 16. 14:49

IEEE 754는 컴퓨터가 실수를 나타낼 때 쓰이는 가장 대표적인 방법이다. 

IEEE 754 floating point , 실수를 '부동 소수점' 이라는 방식으로 나타낸다. 


숫자는 다음과 같이 표현된다. 


S는 부호비트를 나타내며 M은 유효숫자를 나타낸다. E는 지수를 표시한다 (2진수)



- 인코딩 방식


exp는 E를, frac은 M 부분을 인코딩 한다.  S는 부호비트이다.



부동 소수점 종류에는 single precision, double precision, extended precision 이 있다. 


single precision은 

- 8exp 비트

- 23frac 비트 로 총 32비트


double precision은

- 11exp 비트

- 52frac 비트 로 총 64비트


extended precision은

- 15exp 비트

- 63frac 비트로 80비트

를 표시한다. Extended precision은 Intel 호환 컴퓨터에서만 사용한다.



이 포스팅의 예시에서 다루는 부동 소수점은  single precision이다. (double precision도 비트를 제외하고 single과 비슷하다)


인코딩 방법은 exp값에 따라 세가지가 있다.  

1. 정규화 방법 (exp가 0, 1이 아닐 때)

2. 비정규화 방법(exp가 0일 때)

3. 특수 값(exp가 111....1일 때)



1. 정규화 

E = exp - bias / exp = E + bias

bias는 exp가 음수가 되는 것을 방지하려고 사용한다. 


M = 1.xxxxx... (유효숫자는 묵시적으로 1으로 시작한다)

bias = 2^(e-1) - 1 (e는 지수비트)



예를 들어서 푼다면

float형의 값 15213이 있다고 하자.


15213은 이진수로 11101101101101로 표현된다. 여기서 유효숫자 M을 1.1101101101101로 표현한다. 

frac은 유효숫자의 소수점 아래, 11011011011010000000000 이다. single precision의 frac은 23비트이기 때문에 나머지 빈곳을 0으로 채워준다. 



다시 정리해서 15213은 2진수로 1.1101101101101 X 2^13 으로 나타낼 수 있다.

E는 13, bias는 127, exp는 140이다.


위의 정규화한 값으로 16진수로도 표현할 수 있다. 


16진수로 표현하는 방법은 exp (10001100) 과 frac을 이용하여 나타낼 수 있다.


exp + frac

-> 10001100  11011011011010000000000을 결합하여 


0100 0110 0110 1101 1011 0100 0000 0000으로 표현 할 수 있다. (466DB400)



2. 비정규화 인코딩


이 인코딩은 floating point에서 0을 표시하기 위한 수단이다. floating point에서는 다른 정교한수는 표현해도 0을 표현할 수 없기에 0에 가까운 수를 표현하도록 인코딩한다. 


비정규화 인코딩은 exp가 0일 때 사용할 수 있다. 

이 인코딩에서는 E = 1 - bias / M = 0.xxxxx로 표현한다.


비정규화는 0이나 0에 가까운 소수값을 표시할 때 사용한다.


3. 특수 값

exp가 111....1일때 사용한다. 


- exp = 1111...1, frac = 0000...0

: 무한(infinity) 표시


- exp = 1111...1, frac != 0000...0

: Not a number를 표시