ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 실수를 비트로 표현하는 방법, 부동소수점
    전공/시스템프로그래밍 2020. 6. 8. 03:33

    int a = 3; 을 32비트로 표현하면 어떻게 될까.

    십진수 3을 이진수로 바꾸면 011이다.

    이 값을 32자리 중 가장 끝자리에 위치시킨다.

    □□□□□...(29개의 빈칸□)011

    그렇다면 float b = 6.25; 일 때 실수 b를 32비트로 표현하려면?

    '부동소수점' 방식을 활용하여 각 비트를 채워야한다.

    32비트는 32개의 칸(□)으로 이루어져있다.

    이를 부동소수점으로 표현할 때는 구간별로 특징이 존재한다.

    □ □□□□□□□□ □□□□...(23개의 빈칸)□□□

    가장 높은 수를 나타내는 한 자리는 부호 비트를 나타낸다.

    중간의 8자리는 지수를 나타내는 부분이다.

    나머지 23자리는 가수를 나타내는 부분이다.

    간단히 예시를 들어 설명해보겠다.

    -118.625 를 부동소수점 방식으로 표현해보자.

    먼저, 정수부와 소수부를 이진수로 바꿔보자.

    정수부는 1110110이고, 소수부는 101이 된다. (0.625 * 2 = 1.25, 0.25 * 2 = 0.5, 0.5 * 2 = 1.0)

    즉, 1110110.101이 된다.

    여기서 부동소수점 방식으로 변경하려면 정수부의 가장 높은 자리수(1)를 제외하고 모두 소수점으로 보낸다.

    1110110.101 → 1.110110101 로. 그리고 감소된 자리수만큼 2를 곱해준다.

    따라서 1110110.101 → 1.110110101 X 2^6 이 나오게 된다.

    자 이제 해당되는 비트에 값을 넣어주면 된다.

    부호는 음수이므로 부호 비트에 1을 넣어주고,

    지수는 6이므로 이진수로 변경해서 110을 넣어주고,

    가수부에는 110110101 을 왼쪽에 순서대로 넣고, 나머지는 0으로 채우면 된다.

    라고 하면 완벽히 틀렸다 ㅋㅋㅋㅋ 다른 부분은 맞는데 지수부에 넣는 값이 틀렸다.

    제대로 계산하려면 bias(바이어스) 상수를 추가해야 한다.

    8비트에서 표현가능한 수의 개수는 2^8 = 256개이다.

    여기서 양수, 음수를 나누면 -128 ~ 127의 정수값을 표현할 수 있다.

    이때, 127을 bias 상수라고 하며, 이 값 실제 지수값인 6과 더해 이진수로 변환한 뒤, 삽입해야 한다.

    즉, 지수 6 + 바이어스 127 = 133을 이진화한 10000101 을 지수부에 넣으면 된다!

    따라서 -118.625 를 비트로 표현하면

    1 10000101 110110101 이 된다!!

    조금 더 예쁘게 보려면

    이 된다.

     

    댓글

Designed by Tistory.