-> 보통 양수와 음수를 구분하기 위해 부호를 사용하는데 2진수에선 양수일때 0, 음수일때 1을 사용하기로 하였고 MSB를 부호를 표현하는 곳이라 결정하였다
-> 양수 0과 음수 0이 똑같은 0이라는것을 명심
-10000과 00000이 동일
-> 이처럼 한 비트를 부호에 사용하고 나머지 비트를 수의 크기 표현하는 방법을 "부호와 크기표현법"이라 한다
-> 이 "부호와 크기표현법"은 2가지 이유로 널리 쓰지못하고있다
1. 비트를 구성하려면 비용이 드는데 0을 표현하는 방법이 2가지라 비용이 낭비
2. 이 표현법을 사용하면 XOR과 AND를 통한 덧셈 계산이 불가
*** 이 부화와 크기표현법을 통해서 +1과 -1을 계산할때 0이 나와야하지만 실제론 -2가 나온다(문제발생)
예를 들어서 +1은 0001, -1은 1001이고 2진법을 이용한 덧셈을 행하면 0이 나와야하지만 1010 즉 -2가 나온다
-> 물론 복잡한 로직을 사용해 연산이 제대로 동작하게 할 수 있으나 모든것을 간단하게 하는것이 더 가치있다
-> 1의 보수란 ?? 양수의 모든 비트를 뒤집는 방법이다
예를 들면 0111(+7)의 각 비트를 뒤집으면 1000(-7)을 얻을 수 있다
-> 부호크기표현법과 비슷하게 부호비트와 나머지로 나누어진다
-> 즉, NOT 연산을 통해서 얻을 수 있다
1. 여전히 0을 2가지 방식으로 표현한다 0000(+0), 1111(-0)
2. 1의 보수에서도 덧셈을 쉽게 할 수 없다, 이를 해결하기위해선
예를 들어서
0010(+2)
+ 1110(-1)
0001(+1)
위와 같은 덧셈이 있다면 MSB에서 올림이 발생하게되는데 이때 이를 결과값의 LSB로 전달한다면 위의 문제를 해결할 수 있고 이를 "순환 올림"이라 부름
-> 위같은 순환올림방법은 잘 동작하기는 하지만 순환올림을 처리하기위한 하드웨어를 추가해야하기에 그다지 좋은 방법이 아니다
2의 보수표현법이란 ?? 어떤 수의 비트를 뒤집고 1을 추가하면 음수를 얻을 수 있다
예를 들면 0010(+2)의 비트를 뒤집으면 1101, 여기에 1을 더해주면 1110(-2)가 된다는것이다
그렇다면 2의 보수방법은 부호크기표현법, 1의 보수에서 나타난 문제점이 있을까 ??
1. 0을 나타내는 표현법
0000(+0)이고 이를 뒤집으면 1111 1을 추가하면 [1]0000MSB에서 올림이 되고 우리가 사용할 수 있는 비트 수는 4비트이기때문에 무시된다, 즉 0000이 되고 처음과 동일하다
-> 2의 보수표현법은 0을 표현하는 방식이 하나이다 !!
-> 2진법에서의 소수를 표현하는법 !!
정수부에선 10진수를 2로 나눠가면서 1이나 0을 뽑았다면 소수부는 10진수에 2를 곱해가면서 1이나 0을 뽑아낸다. 그리고 정수부 변환할 때는 1이 나오면 종료했다면 여기서는 0이 나오면 종료하고, 결과를 밑에서부터가 아니라 위에서부터 읽어준다.
0.625를 이진수로 변환하는 예시를 보자.
0.625 * 2 = 1.25 -> 1을 빼내고 나머지 0.25
0.25 * 2 = 0.5 -> 0을 빼내고 나머지 0.5
0.5 * 2 = 1.0 -> 1을 빼내고 나머지 0
나머지 0이 나왔으니 변환을 종료하고 빼낸 숫자들을 위에서부터 읽어주면 된다. 즉 0.625 -> 0.101이 된다.
출처: https://gsmesie692.tistory.com/94 [환상빛 별하늘: Reb∞t]
-> 고정소수점표현법이란 ?? 2진수를 사용해 소수를 표현하기위해서 임의로 소수점의 위치는 정하는 방법이 있다, 예를 들어 4비트가 있다면 2비트는 숫자를 표현, 나머지 2비트는 분수를 표현하듯이 항상 소수점의 위치가 일정하기에 이러한 방식을 위처럼 부른다
-> 이 방법도 정수부분은 2진수에서와 동일하게 값을 나타내고 소수점 아래부분은 10진수와 비슷하게 10진수에선 1/10, 1/100처럼 10의 거듭제곱을 분모로 사용하듯이 1/2, 1/4 등 2의 거듭제곱을 분모로 사용한다
예를 들어 00.01(1/4), 10.01(21/4), 11.11(33/4)
- 쓸모있는 범위의 실수값을 표현하기위해 필요한 비트 개수가 너무 많아 범용컴퓨터에선 사용하는 경우가 드물다(범위컴퓨터란 일반적인 문제를 해결하기위한 컴퓨터로 넓은 범위의 수를 다룰 수 있어야하는데 이 방법을 사용하면 메모리비용이 매우 많이 들기때문)
-> 과학적 표기법에서 10진 소수점 왼쪽이 한자리뿐인 소수(가수)에 10을 몇번(지수) 거듭제곱하는 방식으로 소수를 표현하는데 예를 들어 0.0012 대신 1.2*10의 -3승 이라 쓰는것이다
-> 위와 같은 방법처럼 2진법을 표기할때는 10이 아닌 2를 밑으로 하여 가수 부분은 2진소수, 지수 부분은 2의 거듭제곱 횟수를 표현한다, 이를 "부동소수점 표현법"이라 한다
부동소수점 표현 방식에서는 2진수로 변환한 결과를 그대로 박아넣지 않고 몇 가지 과정을 추가로 거친다.
정규화라는 단어는 수학이나 컴퓨터 분야에서 다양한 의미로 쓰이지만 여기서 말하는 정규화라는 것은 2진수를
1.xxxx... * 2^n
꼴로 변환하는 것을 말한다.
변환하는 방법은 간단한데, 정수부에 1만 남을 때까지 소수점을 왼쪽 (*정수부가 0일 경우엔 오른쪽. 아래에서 다시 설명) 으로 이동시키고 이동한 칸 수만큼 n 자리에 집어넣으면 된다.
예를 들어서 위에서 봤던 111.101을 정규화하면 1.11101 * 2^2가 된다.
여기서 소수점을 '이동' 시킨다는 데서 '부동' 소수점, floating point라는 용어가 나온 것이 아닌가 싶다.
출처: https://gsmesie692.tistory.com/94 [환상빛 별하늘: Reb∞t]
- 0을 표현하는 방법이 4가지나 되고 다른 수를 표현하는 방법 또한 2개이상이다
- 비트 패턴이 가능한 모든 수를 표현하지는 못한다
- 위의 부동소수점 수 시스템은 컴퓨터에서 계산 수행에 있어서 실수를 표현하는 표준방법
- 하지만 다른점은 많은 비트를 사용, 가수와 지수에 각각 부호비트를 사용(하지만 지수에 대한 부호비트는 지수의 비트 패턴에 의해 감춰짐)
- 낭비되는 비트 조합을 최소화, 반올림을 쉽게 하기위한 여러가지 트릭제공 등등
-> 위와 같은 여러 기능을 IEEE 754라는 표준으로 기능을 정의한다
부호, 지수, 가수
IEEE 754 부동소수점 표현에서 숫자는 아래와 같이 부호부, 지수부, 가수부의 세 부분으로 구성됩니다.
각 부분의 역할과 사용하는 비트 수는 아래와 같습니다.
부호부 (Sign) : 1비트. 숫자의 부호를 나타내며, 양수일 때 0, 음수일 때1이 됩니다.
지수부 (Exponent) :8비트. 지수를 나타냅니다.
가수부 (Mantissa) : 23비트. 가수 또는 유효숫자를 나타냅니다.
첫번째로 부호를 확인합니다.
부호가 음수이므로 32비트의 가장 앞자리는 1이 됩니다.
두번째로 숫자의 절대값을 2진수로 표현합니다.
314.625는 2진수 100111010.101 (2) 가 됩니다.
이 2진수의 소수점을 아래와 같이 왼쪽으로 이동시켜서 소수점 왼쪽에 1만 남도록 합니다.
이제 2진수 100111010.101 (2) 를 아래와 같이 표현할 수 있는데, 이 방식을 정규화된 표현 방식이라고 합니다.
그리고 소수점의 오른쪽 부분 00111010101을 가수부 23비트의 앞에서부터 채워줍니다.
남는 자리는 0으로 채워줍니다.
이제 지수부를 채울 차례입니다.
지수는 8입니다.
지수 8에 bias인 127을 더해줍니다. (bias는 2 k-1 로 주어지는데 k는 지수부의 비트수 8입니다.)
아래와 같이 8에 bias를 더한 135를 2진수로 변환합니다.
변환한 2진수 10000111 (2) 을 8비트 지수부에 채워줍니다.
->위와 같은 과정을 통해 숫자 -314.625를 32비트 단정도 부동소수점 방식으로 표현하면 11000011100111010101000000000000가 됩니다.