# 1의 보수, 2의 보수, 부동소수점과 바이어스(bias) 표현
Programming 2017. 11. 1. 00:371의 보수, 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 |