# 1의 보수, 2의 보수, 부동소수점과 바이어스(bias) 표현

Programming 2017. 11. 1. 00:37

1의 보수, 2의 보수, 부동소수점과 바이어스(bias) 표현

1의 보수

0을 1로, 1을 0으로 반전 시킴

ex) 01001011 → 10110100


2의 보수

0을 1로, 1을 0으로 반전 시킨 후, 끝자리에 1을 더함

(-75의 2진수) = (75의 2의 보수의 끝자리에 1을 더한 수)

→ 75의 2진수 = 0100 1011

→ 75의 2진수의 2의 보수 = 1011 0100

 

100-75 = 100+(-75)

   0110 0100 (100)

+ 1011 0100 (-75)

-------------------------------

  10001 1000 → MSB를 버린, 0001 1000 (25)


소수 2진수 변환

10.42123

10의 2진수 = 1010

0.42123의 2진수

0.42123 X 2 = 0.84246 → 0

0.84246 X 2 = 1.68492 → 1

0.68492 X 2 = 1.36984 → 1

0.36984 X 2 = 0.73968 → 0

0.73968 X 2 = 1.47936 → 1

0.00000이 나오면 계산 끝냄

10.41123의 2진수 = 1010.01101…


부동소수점과 바이어스(bias) 표현

일반적으로 부동소수점의 32비트 형식은 아래와 같다.

부호비트(1bit)

Sign 

지수비트(8bits)

Baiased exponent

가수비트(23bits)

Significand 

바이어스 상수는 지수의 2진수(음수일 때는 2의 보수)와 바이어스 상수의 합니다.

아래는 32비트 부동소수점을 변환한 예시이다.

 1.1010001 X  = 0 10010011 10100010000000000000000 =  1.6328125 X 

-1.1010001 X  = 1 10010011 10100010000000000000000 = -1.6328125 X 

 1.1010001 X  = 0 10010011 10100010000000000000000 =   1.6328125 X 

-1.1010001 X  = 0 10010011 10100010000000000000000 =  -1.6328125 X 

(아래 두 예시 계산할 때 지수비트(8bits) 맞춰서 계산한다. 앞에 비트 생략해버리면 결과가 엉뚱하게 나온다.


일반적으로 32bits 형식의 부동소수점은 ‘float’라고 보면 되며, 64bits의 부동소수점은 ‘double’이라고 보면 된다. double형은 float형에 비해 범위와 정밀도가 높기 때문에, 좀 더 크거나 작은 수를 표현할 수 있으며, 보다 정확한 연산을 요구하는 작업이라면 사용해야 한다. 반면, float형보다 2배의 공간을 차지한다.

프로그래밍 할 때, 원치도 않았는데 반올림 되거나 올림 되는 경우가 있던데 이것은 틀린 것이 아니었으며, 컴퓨터의 계산은 완벽할 것이라는 나의 오해였다. 부동소수점에서는 정확하지 않은 결과값들에 대해 그 표현법으로 나타낼 수 있는 가장 가까운 값으로 반올림하는 경우가 많다.


참조 자료

William Stallings 저, 『컴퓨터 시스템 구조론』, PEARSOnN

http://thrillfighter.tistory.com/349

'Programming' 카테고리의 다른 글

# 디스크 스케줄링  (1) 2017.11.01
# 빅 엔디언, 리틀 엔디언  (0) 2017.11.01
#가변 할당 기반 교체 기법  (1) 2017.10.30
# 스토어드 프로그램 예외 발생 정리  (0) 2017.10.27
#대칭키와 공개키  (0) 2017.10.26
admin