부동소수점

정유석·2024년 5월 30일

c언어 외

목록 보기
4/8

컴퓨터는 부동소수점 방식으로 실수를 처리 (IEEE754 표준)
123.456이 있을때 우선 정규화(정수부를 0이 아닌 한 자리로 이동)
정규화->1.23456 x 10^2 (1.23456 : 가수부, ^2 : 지수부)
0.00368
정규화->3.68 x 10^-3 (3.68 : 가수부, ^-3 : 지수부)

하지만 실제로는 2진수 사용
50.625 -> 110010.101
정규화 -> 1.10010101 x 2^5
소수부를 2진수를 변환하는 방법은 소수부가 0 이 될때 까지 2를 계속해서 곱하고 정수부만을 사용 (곱셈을 했을때 곱하는 수 이상의 값은 다음 자릿수에서 나올수 없다 2를 곱했기 때문에 최고 자릿수는 1이하)
0.625 x 2 = 1.250 에서 1
0.250 x 2 = 0.500 에서 0
0.500 x 2 = 1.000 에서 1
또는
소수 첫째 자리는 2^-1(0.5 또는 1/2)
둘째 자리는 2^-2(0.25 또는 1/4)
이런식으로 가중치를 줘서 계산


가장 왼쪽 비트가 부호비트(양수:0, 음수:1), 그다음 8비트가 지수부(정규화 한 후에 나온 지수에 127을 더한 값을 저장), 그다음 23비트가 가수부(정규화는 정수부를 0이 아닌 한 자리로 이동하는것이기 때문에 정수부는 항상 1이다 따라서 그 이하 소수부만 가수부에 저장해준다)

32비트 기준 127 초과 표기법에선 지수 비트가 0111 1111(127)로 초기화 되어있다, 왜냐하면 지수가 음수인 경우도 처리하기 위해서

따라서, 50.625->110010.101->정규화->1.10010101 x 2^5
부호비트 s는 0, 지수비트 e는 1000 0100(132=127+5), 가수부 m은 1001 0101

위의 식으로 다시 실수로 복원할 수 있다.
부호비트를 통해 +-결정 m자리에 가수부 값을 넣고 지수부 값을 넣으면(e=132)(132-127=5) 다시 1.10010101 x 2^5가 된다

위의 과정중에 소수부를 2진수로 표현할때 2의 (-)거듭제곱 수들의 조합으로 표현 하기때문에 모든 수들을 나타낼수는 없다 따라서 그에따른 오차들이 발생할수있음을 주의해야한다.

profile
개인 기록공간

0개의 댓글