데이터의 표현과 컴퓨터 연산2 - 부동소수점의 표현
데이터의 표현과 컴퓨터 연산
3.2. 정수의 표현
컴퓨터의 가장 근본이 되는 기능은 수치의 계산이라고 할 수 있다.
이걸 수행하는 가장 핵심적인 장치가 바로 CPU안에 있는 ALU라고 하는 하드웨어이다.
(ALU의 구조)
컴퓨터는 2진수의 체계로 수를 저장하고 표현한다.
모두가 잘 아는 이진수의 체계인데 한번 더 짚고 넘어가자면,
소수점 이하의 이진수는 2^(-1), 2^(-2), ... 를 의미한다.
ex) 0.101(2) = 0.5 + 0.125 = 0.625
컴퓨터는 양수 뿐만 아니라 음수도 처리하기 때문에 음수를 표현하는 방법이 필요하다.
이를 수행하는 데에는 여러가지 방법이 있는데, 공통적인 부분은 2진수의 가장 왼쪽 비트가 부호 비트로 사용된다는 점이다.
맨 왼쪽 비트, 즉 최상위 비트는 MSB(most significant bit)라고 불리기도 한다.
부호 비트를 사용하는 2진수 표현으로는 다음과 같은 세 가지 방법들이 있다.
1. 부호화-크기 표현
2. 1의 보수 표현
3. 2의 보수 표현
3.2.1. 부호화-크기 표현
signed-magnitude representation
맨 왼쪽 비트가 부호비트가 되고, 나머지 비트가 수의 크기를 나타내는 방식이다.
이 방식에서 결점은, 덧셈과 뺄셈을 수행하기 위해서는 부호 비트와 크기 부분을 별도로 처리해야 한다는 점이 그렇다. 또한, 0을 표현하는 방식이 -0, +0으로 두 가지라는 점 역시 결점이다.
3.2.2. 보수 표현
1의 보수 표현은, 수의 부호를 바꾸려고 할 때 즉 양수에서 음수로 가거나 음수에서 양수로 갈 때, 모든 비트들을 반전하는 방식이다.
이와 다르게 2의 보수 표현은, 1의 보수 표현과 비슷하게 모든 비트를 반전하되 1을 마지막에 더해주는 방식이다.
예를 들어보면 다음과 같다.
+9 = 0 0001001
-9= 1 0001001(1의 보수 표현법)
-9= 1 0001010(2의 보수 표현법)
1의 보수법의 불편한 점은 다음과 같다.
1) 0을 표현하는 방식이 2가지이다.
편의 상 5 비트로 수를 표현한다고 할 때 1의 보수 표현법으로 0을 표현하면 0 0000 과 1 0000 으로 -0, +0이 있다.
2)연산 시에 음수간의 연산인지, 양수 간의 연산인지 직접 판단하여 값을 더할지 뺄 지 정해주어야 한다.
이와 다르게
2의 보수 표현법의 장점은 다음과 같다.
1)수를 표현하면 1의 보수와 다르게, 비트 반전 후에 1을 더하면 바로 부호만 변경된 수를 얻을 수 있다.
2) 0을 표현하는 방법이 1가지이다.
2의 보수 표현법으로 0을 표현하면 0 0000 , 그리고 (1 1111 + 1 = 0 0000) 으로 한가지 방법만 존재한다.
3) 1으로 인해, 모든 연산을 더하기로 처리할 수 있게 된다.
2의 보수를 어떻게 쓰는 지 알아보자.
- 2의 보수로 표현된 8-비트 음수를 10진수로 표현하는 방법
1) 가장 앞의 음수표현에 나머지 수는 더하는 방식으로 할 수 있다.
ex ) A = 10101110(2)
A = -128 + (32 + 8 + 4 + 2)
= -82
2) 또 다른 방식으로는, 이미 음수임을 알고있으니 양수로 전환 후에 -를 붙여주는 방법도 있다.
10101110(2) - (01010001 + 1)(2) = - (1+ 16 + 64 + 1) = -82
3.2.3. 부호-비트 확장
비트가 확장될 때는, 비트의 앞쪽으로 비트가 확장되는데 부호비트와 같은 비트로 확장시킨다.
ex) 10진수 21과 -21에 대한 8-비트 길이의 부호화-크기 표현을 16비트 길이로 확장하자.
21 = 00010101(2)
-21 = 11101011(2)
16비트 확장
21 = 0000 0000 0001 0101(2)
-21 = 1111 1111 1110 1011(2)
→ 확인을 위해 다시 비트 반전하면 0000 0000 0001 0100(2) 이고
1을 더하면 0000 0000 0001 0101(2) 값을 계산하면 21이 맞다.
현대 컴퓨터에서 쓰이는 수의 표현 체계는 2의 보수법이다.
2의 보수법
: 모든 연산을 덧셈으로 연산하기 위해서 이 방법을 사용한다.
요약하자면 1의 보수법 후에 +1을 더하는 방법이다. (0을 1로, 1을 0으로 반전 시킨 후 1더하기)
ALU에서는 연산시 다음 플래그를 사용한다 : C V Z S → carry ,overflow, zero, sign 플래그이다.
V flag- 오버플로우 확인하는 방법: carry in ≠ carry out 인 경우에 해당한다.
부동소수점 수의 표현
:소수점의 위치를 이동시킬 수 있는 수의 표현 방법: 수 표현의 범위를 확대한 것.
N이라는 숫자가 있을 때, 아래와 같은 형태로 표현한다.
컴퓨터에서는 B가 2, M이 이진수로 표현된 수일 것이다.
S : 부호 , M : 가수(mantissa) , B : 기수(base), E : 지수 (exponent)
S: sign 필드 E : 지수 필드 : 십진수로 바꿔서 B의 제곱. M : 가수 필드. B^E에 이걸 곱해서 표현한다.
E 비트 수가 커지면 표현할 수 있는 데이터 범위가 늘어나고, M 비트 수가 커지면 정확도가 늘어난다!
- biased exponent :
0을 제대로 표현하기 위해 나타난 방법으로, bias에 특정 수를 더해서 bias로 표현한다.
실제 지수값은 바이어스에 따라 가장 작은 값 ( ex. bias. = 127이면 0은 -127.) 이 된다.
아래 예제를 보자.
E bit의 값이 실제값은 100(2), 십진수로는 4임에도, 표현할 때는 bias인 128을 더한 값을 사용하는 것을 볼 수 있다.
또한 M bit에서 0. 다음에 오는 수는 반드시 1이므로, 소수점 자리에서 맨 앞의 1을 제외하고 표현한다.
이진수로 0.1101101일 때 소수점의 자리 수가 1101101일 때, 101101로 쓸 수 있는 것이다!
IEEE 754 표준 부동소수점 수의 형식 (32 - bit)
이 형식에서는 bias를 127로 사용하고, 노란 형광펜이 칠해진 줄에서 보이는 비트 수만큼 각 비트수를 갖는다. (1,8,23)
아래 예시를 보자.
* 32비트 데이터 형식의 표현 가능한 수의 범위
(참고)