부동 소수점의 의미

영어로 floating point라고 하며, 소수점이 떠다닌다는 의미를 가지고 있습니다.

컴퓨터에서 실수를 표현하는 방법으로 소수점의 위치를 고정하지 않아, 사용하는 비트 수 대비 넓은 범위의 숫자를 표현한다는 장점이 있습니다.

IEEE 754에서 부동 소수점의 개념을 표준화하였습니다.

 

 

 

 

고정 소수점과의 차이

고정 소수점에서는 정수와 소수 부분의 영역을 나눠서 수를 표현하지만, 부동 소수점에서는 유동적으로 소수점을 이동시킬 수 있습니다.

32비트만큼을 사용해서 실수를 표현한다고 가정할 때, 고정 소수점을 부호 1비트, 정수 부분을 8비트, 소수 부분을 23비트로 표현한다고 합시다. (1+8+23 = 32)

 

 

그런데, 정수 부분은 8비트만큼만 사용할 수 있어서 -2^8 ~ 2^8 (-256 ~ 256) 만큼의 정수만 표현할 수가 있습니다.

소수 부분까지 합친다면 -256.xxx ~ 256.xxx 범위의 수를 표현할 수 있는 것인데요.

숫자를 표현하는 범위가 작다는 단점이 있습니다.

 

 

 

 

 

 

 

 

 

 

부동 소수점 표현

부동 소수점도 32비트로 표현해볼 수 있는데요.

부동 소수점은 1)가수 (fraction), 2)지수 (exponent), 3)밑수 (base) 로 수를 표현할 수 있습니다.

 

 

십진수 13.075를 부동 소수점으로 표현하면, 1.3075 * 10^1 또는 0.13075 * 10^2 형태로 표현할 수 있는 것이죠.

13.075를 이진수로 변경하면, 1101.11 가 되고 11.0111 * 2^2 또는 0.110111 * 2^4 처럼 부동 소수점으로 표현할 수 있습니다.

 

 

고정 소수점 (32비트 기준) 에서 정수 부분을 8비트로 잡았을 때, 숫자의 범위가 굉장히 제한적이었는데요.

부동 소수점 (32비트 기준)에서는 지수 부분이 8비트라면, 지수의 값의 범위가 0~256 되기 때문에 큰 숫자를 표현할 수 있습니다.

 

 

물론 고정 소수점에서 정수 부분의 비트 공간을 늘리고 소수 부분의 비트 공간을 줄여서, 숫자의 크기를 늘릴 수 있습니다.

그럼에도 불구하고, 표현할 수 있는 소수 범위가 좁아지고 부동 소수점에 비해 표현할 수 있는 숫자의 크기에 한계가 있습니다.

 

 

 

 

 

 

부동 소수점의 정규화

부동 소수점에서의 정규화의 의미는,,

가수의 첫 번째 자리가 밑수보다 작은 한 자리 자연수가 되도록 소수점 위치를 이동시키는 것입니다.

 

 

2진수에서 부동 소수점을 정규화하면, 가수의 첫 번째 자리 (정수 부분) 는 항상 1이 되는데요.

그렇기에, 이 1을 생략해주고 1비트 만큼의 공간이 생기므로 소수 부분의 숫자를 한 자리 더 넣어줄 수 있습니다.

 

 

이진수 1101.11을 정규화된 부동 소수점으로 표현하면 1.10111 * 2^3 이 됩니다.

가수 부분에 첫 번째 1을 생략해서 아래와 같이 표현할 수 있습니다.

 

 

지수의 값은 3이라서 이진수 11을 지수 부분에 넣어줬는데요.

실제로는 이진수 11이 아닌 다른 값이 들어가게 됩니다.

그 부분은 아래에서 추가적으로 설명하겠습니다.

 

 

 

 

 

편향된 지수 (biased exponent)

부동 소수점의 지수 부분에는 지수를 위한 부호 비트가 없습니다.

지수가 음수인 경우를 표현을 해줘야 하는데요.

 

 

그래서 편향된 지수라는 개념이 등장합니다.

바이어스 (biased) 라는 말처럼 지수를 어느 정도 치우치는 것인데요.

 

 

쉽게 말해서, 지수값에 특정값을 더해줘서 지수의 음수값과 지수의 양수값을 표현해주겠다는 것입니다.

지수의 값은 2^(비트 수) 만큼 표현될 수 있는데요. (8비트 기준, 2^8 = 256)

그 범위를 절반을 자르고, 0 한개를 제외한 값을 특정 상수 (바이어스 상수)로 정합니다.

 

 

(8비트 기준) (2^8 / 2) - 1 = 127

 

 

 

편향된 지수의 개념은, 지수값이 바이어스 상수인 경우 (여기서는 127) 지수값이 0이라고 생각하는 것입니다.

즉, 기존 지수의 값에 바이어스 상수를 빼주면, 편향된 지수의 값을 알 수 있습니다.

 


 

그런데 float 0.0f 값과 무한대와 0에 매우 가까운 작은 값은 어떻게 표현하는가?

 

먼저 지수가 0 인 경우를 생각해본다면

 

지수값이 0이라고 해서 float 값이 반드시 0이 되는 것은 아닙니다.

 

float는 크게 3가지로 구성됩니다.

  • 부호부: 양수인지 음수인지

  • 지수부: 숫자의 크기를 결정

  • 가수부: 숫자의 세부적인 값을 결정

여기서 지수값이 0이면 다음과 같이 처리합니다.

지수값                            가수부                                      결과
0 0 float 값은 0
0 0이 아님 0에 매우 가까운 작은 숫자
1~254 상관없음 일반적인 숫자
255 상관없음 무한대 또는 NaN

그렇다면 왜 지수값이 0일 때 특별하게 처리할까요?

일반적인 float로 표현할 수 있는 가장 작은 양수보다 더 작은 숫자도 표현하기 위해서입니다.

예를 들어 일반적인 방식으로 표현할 수 있는 가장 작은 양수가 0.0001이라고 가정하면,

지수값 0을 특별하게 처리해서 0.00001, 0.000001 같은 더 작은 숫자도 표현할 수 있게 하는 것입니다.

즉, 지수값 0은 숫자 0과 아주 작은 숫자들을 표현하기 위해 특별히 마련된 구간이라고 이해하면 됩니다.

 

 

 

 

 

 

 

 

ref : https://cheolsker.tistory.com/94

반응형

+ Recent posts