ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 실수형 (부동 소수점)
    헷갈렸던것 2021. 9. 3. 19:45
    728x90

    실수형 float를 공부하다 부동소수점 개념이 나와서 한번 이해하는대로 정리해 보려합니다.

    먼저 예를 들어 실수 263.3을 2진수로 나타내 보면 

    정수 부분 263 = 100000111   

    실수 부분 0.3 = 0.01(0011)(0011)(0011)(0011)(0011).......

    이렇게 실수 부분이 무한적으로 반복되는 것을 알 수 있습니다.

    따라서 컴퓨터는 오차는 있겠지만 이러한 실수부분을 저장해야합니다.

    그 방법에는 고정 소수점과 부동 소수점이 있습니다.


    고정 소수점

    미리 정수 비트 와 소수 비트를 정해 놓는 방식 입니다.

    4byte =32bit 기준으로 예를들어 1bit는 부호 표시용, 16bit는 정수 부분, 15bit 는 실수 부분으로 정해놓으면

    더 큰수나 정밀한 수를 표현하기에 어렵습니다. 

    정수가 16bit를 넘어가거나 실수 부분 소수가 더 길어지면 15bit로 표현하기 어렵기 때문입니다.

    이를 방지하고자 부동소수점 방식이 나왔습니다.


    부동 소수점

    기본적으로 가장 널리 사용하는 IEEE 754방식을 따릅니다.

     

    32 bit IEEE 754

    먼저 크게 부호 부분(msb)과 지수 부분(exponenet), 가수부분(fraction, mantissa)이 있습니다.

    예를 들어 263.3 을 부동 소수점 방식을 사용하여 나타내면,

    먼저 부호부분은 양수이므로 0이 됩니다. 이는 하늘색 부분에 들어갑니다.

    그다음 263의 이진법 100000111 과 실수 이진법 0.01001100110011....

    그 둘을 합치면 100000111.01001100110011.... 이 됩니다.

    그 다음 소수점을 맨앞에 있는 1바로 직전까지 옮깁니다.

    그러면 1.0000011101001100110011.... ×2^8(이진법에서 소수점을 8칸 옮기므로)이 됩니다.

    여기서 2^8을 지수라 하면 8과 IEEE754 의 고유 바이어스 지수(Bias) 127을 더해줍니다.

    따라서 127 + 8 = 135가 됩니다. 135를 이진법으로 나타내면 10000111 입니다. 

    10000111은 지수 부분이므로 연두색 부분에 들어갑니다. 

    그리고 아까 소수점 뒤에 부분을 가수부에 넣어 주면 됩니다.

    부호비트(1 bit) : 0

    지수비트(8 bit) : 10000111

    가수비트(23 bit) : 0000011101001100110011.....

    따라서 0100 0011 1000 0011 1010 0110 0110 0110 이 됩니다.

    여기서 중요한게 263.3의 소수부분 0.3의 이진수 0.0100110011001100...도 10진수로 나타내면

    0.29998779296875... 가 되어 정확히 0.3을 표현할 수는 없습니다.

    따라서 부동소수점 방식도 효율적으로 실수는 저장할 뿐이지 정확한 수는 저장 할 수 없습니다.

    0.1을 10번 더해보면 

    가 나오듯이 정확한 실수는 저장하지 못하는 것 같습니다.

    결론적으로 실수형으로 코딩을 할때나 계산을 할때에는 주의가 필요할것 같습니다.

    더하여 만약 float로 정확한수를 표현하기에는 한계가 있으므로 더큰수가 들어온다면 상대적으로 float보다 더 정확한 double형을 쓰는게

    방법일 수 도 있습니다. double형은 (8 byte)이므로 가수부의 크기가 크기때문에 좀더 섬세한 수 표현이 가능해 오차를 줄일 수 있기 때문입니다.

    '헷갈렸던것' 카테고리의 다른 글

    비트 연산  (0) 2022.01.21
    삼항조건연산자  (0) 2021.09.27
    버퍼(buffer) c/c++  (0) 2021.09.07
Designed by Tistory.