공돌하우스

부동 소수점 본문

C_Language

부동 소수점

전자둥이 2021. 5. 1. 11:26

안녕하세요 전자둥이입니다~

 

이번에는 부동소수점개념에 대해서 가져와봤어요.

 

부동소수점이 어떤건지 대충은 알고있었지만 제대로 알고는 있지 않아 이번기회에 제대로 알아볼려구 합니다.

 

먼저 c언어에서 실수를 나타내기 위해서 float 또는 double 타입형을 사용하는건 알고 계실거에요.

 

저는 float타입은 4바이트 double타입은 8바이트로 저장되는 정도만 알고있었는데요. 

 

IEEE 754에서 표준으로 실수 값을 저장하기 위해 4바이트, 8바이트, 16바이트의 저장형식을 정의하였는데요.

그중에서 제일 많이 사용되는 4바이트와 8바이트인 single, double에 대해서 알아보겠습니다.

 

float은 single타입으로 저장

double 은 double타입으로 저장

예를 들어 float a = 6.5; 라고 선언을 하게되면 a변수에는 single타입으로 저장이 되어지고 32비트에는 어떤식으로 저장되는지 살펴봅시다.

 

single타입으로 저장될 때 필요한 정보가 3가지가 있습니다.

-부호

-지수

-유효숫가

 

해당 정보를 얻기위해서 6.5라는 실수를 이진수를 변환하고 정규식표현법으로 고쳐보겠습니다.

 

6.5 => 110.1(2) => 1.101x2^2

 

여기서 부호는 양수, 지수는 2, 유효숫자는 1101 입니다.

 

그럼 이를 토대도 총 32비트를 채워보겠습니다. 부호는 양수이므로 부호비트에 0을 넣게되고(음수이면 1이 들어갑니다.), 지수값 2는 지수부분에 저장하게 되는데 2에 127을 더해서 이진수 형태로 저장합니다. 따라서 2 + 127 = 129 => 10000001의 형태로 저장되어진다.

- 127을 더하는 이유

 여기서 왜 127을 더하는지 궁금해하는 사람이 분명 있을겁니다.(저 포함)

 바로 음의 지수값을 양수로 표현하고자 하는 것입니다. 이렇게하면 실수값을 대소비교할 때 정수값처럼 비교할 수 있으므로 실행속도를 빠르게 할 수 있습니다.

위의 그림을 살펴보면 지수비트만 가지고 실수끼리 대소비교를 할 때 쉽게 할수있다는걸 확인 할 수 있습니다.

 

마지막으로 유효숫자는 1101중 맨 앞의 1을 제외한 나머지 부분, 즉 정규화 표현에서 소수부분만을 저장하게 됩니다. 이렇게 하는 이유는 정규화된 모든 이진수는 유효숫자가 반드시 1로 시작하게 되므로 제외시켜서 한정된 비트의 저장공간에 유효숫자를 하나라도 더 자장하기 위한 것입니다. 결국에는 아래와 같이 저장됩니다.

 

0 10000001 10100000000000000000  

 

이상으로 single타입의 부동소수점으로 변환하는 방법을 살펴보았습니다. double형태도 single형태로 저장하는 방식이 똑같습니다. 단지 비트가 더 커진겁니다~ 

 

이를 토대로 double형태로도 변환해보고 역변환도 해보시면 좋을거같습니다~ 

 

지금까지 긴 글 읽어주셔서 감사합니다~