float 저장 구조

2010. 3. 23. 17:58카테고리 없음


 

부동소수점의 표현은 float, double, long double 등의

표현 방법이 조금씩 다릅니다. 하지만 기본은 같으니 일단

float형을 기준으로 설명합니다.

(계산하기 귀찮아서 “C 배우는 알고리즘 책에서 예를 인용합니다.)

 

float 형은 32bit 구성되며 부호부(signed bit),

지수부(exponent part), 가수부(fraction part 또는 Mantissa)

이루어져 있습니다.

 

예에서, ( 예는 계산하기 너무 힘듬… )

 

0 10000101 00000000000000010101101

 

번째 1 bit 부호부,

번째 8 bit 지수부,

뒤의 23 bit 가수부입니다.

 

부호부는 0이면 +, 1 이면 입니다.

 

지수부는 자체가 지수부의 값이 아니라 수치에서 bias 값을 주어야

값이 나옵니다. 일반적으로 float에서 bias 값은 127 입니다.

 

가수부는 가장 좌측의 값이 20 , 다음이 2-1, 다음은 2-2, … 입니다.

 

지수부를 e, bias b, 가수부를 m 이라고 한다면 값은

 

m x 2(e-b)

 

됩니다.

 

예를 들어 1/16 = 0.0625 실수로 표현해 보면

 

0 01111111 00001000000000000000000 = 1/16 x 2(127-127)

0 01111110 00010000000000000000000 = 1/8 x 2(126-127)

0 01111101 00100000000000000000000 = 1/4 x 2(125-127)

0 01111100 01000000000000000000000 = 1/2 x 2(124-127)

0 01111011 10000000000000000000000 = 1/1 x 2(123-127)

 

여러 가지 표현이 있을 있는데 기준을 정한 것이 가수부의 최좌측 비트는 무조건

1~2 값으로 만듭니다. 그런데 최좌측 비트가 무조건 1이라면 굳이 1 쓰지 않아도

되니 1 생략해서 표현합니다.

 

여기까지 입니다.

 

이제 진짜 예를 들어 보겠습니다.

 

0 10000000 10000000000000000000000

 

이라는 값이 있다면

 

가수부는 앞에 1 생략되어 있으므로 실제로는 11 이므로

1 x 20 + 1 x 2-1 = 3/2 = 1.5 되고

지수부는 2(128-127) = 2 이므로

 

최종적으로 1.5 x 2 = 3 이라는 수가 됩니다.

 

예를 하나 들어 볼까요?

 

1 01111110 00000000000000000000000

 

어떤 값이 됩니까?

 

가수부는 1 (생략되어 있다고 했죠.)

지수부는 2(126-127) = 2-1

 

결론은 (-) 1 x 2-1 = -0.5  

 

이해가 되었습니까?

 

[출처] 부동소수점 표현|작성자 xtElite