이진수와 부동소수점

khbin·2023년 10월 25일

컴퓨터는 0과 1로 이루어진 이진수를 바탕으로 동작한다.

이진수

10진수는 각 자리가 표시할 수 있는 수가 0~9 까지 10개여서 10진수이고
2진수는 각 자리가 표시할 수 있는 수가 0~1 2 개여서 2진수이다.

10진수로 표현된 143 은 각 자리가 백의 자리(102)(10^2) 십의 자리(101)(10^1) 일의 자리(100)(10^0) 이다.

(1x102)+(4x101)+(3x103)=143(1 x 10^2) + (4 x 10^1) + (3 x 10^3) = 143

마찬가지로 2진수도 각 자리 별로 일의 자리에서 202^0부터 시작해서 왼쪽으로 갈 수록
21,22...2^1, 2^2 ... 순이 된다.

나는 이진수를 만들어야 할 때 가장 큰 2의 제곱 수를 떠올려서 빼는 과정을 반복하면서 이진수를 만든다.

143128=15158=774=332=1\begin{aligned} 143-128&=15\\ 15-8&=7\\ 7-4&=3\\ 3-2&=1 \end{aligned}

이런식으로 진행을 한 후 뺀 값들의 비트만 1로 표현하는 방법을 사용한다.
->1000 1101

소수의 경우도 마찬가지인데, 소수 첫째자리부터 2^-1 2^-2 2^-3... 순으로 간다.

0.6875=0.5+0.125+0.06250.6875 = 0.5 + 0.125 + 0.0625

->0.1011

고정소수점과 부동소수점

고정소수점과 부동소수점의 차이는 말에서도 대강 유추할 수 있듯이 소수점이 고정되어있느냐 혹은 움직이느냐의 차이이다.
? 왜 소수점을 움직이느냐 한다면 123.456이란 수가 있고 고정소수점의 경우 정수 부분 123과 소수 부분 456을 나눠서 표현해야 한다. 즉 한정된 비트에 분할해 배치할 경우 나타낼 수 있는 수의 범위가 무척 한정된다.

그래서 부동소수점을 주로 사용하게 되는데 소수점이 움직인다면 큰 수를 표현할 수도 있고 혹은 더 세밀한 수도 표현을 할 수가 있게 된다.

부동소수점 구조

-9.6875란 수가 있고 이 수를 부동소수점으로 표현해보자.
우선 이진수로 표현하면 -1001.1011(2)가 되었고, 이대로 저장하면 고정소수점이 된다.
부동소수점 방식으로 바꾸기 위해 정규화 과정을 거치게 되는데 부호부 음수, 정수부 1001, 소수부 1011을 각각 저장해야 되기 때문이다. 따라서 부동소수점 방식으로 저장하기 위해 정규화 과정을 거치는데, 바로 지수를 이용해 실수를 표현하는 것이다.

정규화 : 정수부를 1로 맞추어 놓고 적절하게 소수점 위치를 조정하는 것

부동소수점 형식은 정해진 비트(32Bit or 64Bit)를 적절히 분배해 부호부, 지수부, 가수부를 할당하는 일종의 규칙이자 약속이다.

float : [부호부 1Bit | 지수부 8Bit | 가수부 23Bit] = 32Bit
double : [부호부 1Bit | 지수부 11Bit | 가수부 52Bit] = 64Bit

-9.6875 → -1001.1011 //이진수화
-1001.1011 → -1.0011011 x 23 //소수점 앞에 한자리만 남도록 옮김
-1.0011011 x 23 //밑줄 친 부분이 가수부의 최상위 비트에 담김

부호부는 양수면 0, 음수면 1이다.
가수부는 정규화 된 식에서 소수점 아래의 유효숫자들이다.
지수부는 정규화 된 식에서 232^3 의 지수. 즉 3을 뜻하게 된다.

float 에서 지수부 8Bit로 -127~128까지 256단계를 나타내야한다.
모두 0으로 채워진 [0000 0000]이 -127을 나타내고, 1 증가한 [0000 0001] 은 -126
모두 1로 채워진 [1111 1111]은 128을 나타내게 된다. < 바이어스 표현법

-1.0011011 x 23 을 비트배열에 나타내려한다면
부호부는 음수이니 1, 가수부는 0011011, 지수부는 -127을 첫번째 기준으로 삼는다면 130번 째가 될 것이다. 즉 130을 2진수로 표현하면 [1000 0010]이 된다.

실제 -9.6875를 float 비트배열에 나타낸 모습이다.






[출처]https://dataonair.or.kr/db-tech-reference/d-lounge/expert-column/?mod=document&uid=52381

profile
틀린게 있다면 언제든지 알려주세요 감사합니다. 으라차차

0개의 댓글