C, C++

[IEEE 754] 부동소수점과 바이어스 표현법

SuuuuuuuL 2018. 12. 12. 09:37

컴퓨터에서 실수를 표현하기 위해 사용하는 방법 
IEEE 754(32bit), 


부호부 1bit 

지수부  8bit

가수부 나머지bit 

-------------------------------------------------------------------------------------------------------------------------------------------------------

1. 먼저 표현하고자 하는 소수(실수) 를 2진수로 변환한 후 소수점 앞의 숫자가 2보다 작아지도록 소수점을 이동시키고

소수점 이동(부동소수점 : 부유하는 소수점 floating point)에 따른 2의 제곱승(-->지수부)을 곱해주어 아래와 같이 만든다 


예)  1.001101 * 2^6  (<<-- 정규화라고도 한다.)


2.  지수부의 표현은 바이어스법에 의한다. 

본래 8bit의 표현가능 숫자의 범위는 -127~ 128 이지만 

부호부가 존재하지 않기 때문에 0000000 을 -127로, 11111111을 128로 정의하기로 약속함 


예) 지수부의 숫자가 6인 경우 (2의6승) 

6 을 이진수로 변환하는 것이 아닌 6+127 = 133을 2진수로 변환한 값을 지수부 8bit에 맞추어 넣어준다. 


3. 가수부에는  소수점 이하의 수를 그대로 왼쪽부터 입력해준다.

--------------------------------------------------------------------------------------------------------------------------------------------------------



int main(){

double x=0.5, y=0.0, z=1.0, w=-1.0;

// 2진수로 변환하여 생각해볼 ...dobule  8yte지만 printf 4byte 버퍼를 사용함  

 

printf("x= %lx %lx\n", x); // %lx %lx 2 들어가있는 이유는 부족한 바이트를 채워야 16진수로 표현이 가능하기때문에..

printf("y= %lx %lx\n", y);

printf("z= %lx %lx\n", z); // 16진수 출력..0000 ....6.. 0001

printf("w= %lx %lx\n", w); //

x= 0 3fe00000

y= 0 0

z= 0 3ff00000

w= 0 bff00000

----------------------------------------------출력값이 위와 같이 나오는 이유에 대한 설명 -------------------------------------


12 진수로 바꾸면 1*20승이무로 지수부에는 0 집어넣어주어야

0011 1111 1111 0000 0000 0000 0000 0000


16진수로 바꾸면

3     F    F    0    0   0    0    0  된다

부호부 지수부 가수부


지수부는 바이어스 표시법으로 0을 표시하기 때문에

011 1111 1111 로 표시됨


http://thrillfighter.tistory.com/349 참고