한 자리의 수를 0,1 2개의 수로 나타내는 수체계. 한 자리수의 값이 1보다 커지면, 다음 자리수로 1을 carry over 시킨다.
10진수(decimal)를 2진수로 변환하는 방법 : 2로 나누고 나머지를 확인한다.
2진수 → 10진수 : $2^i(i\in\mathbb{W})$
컴퓨터 공학에서 1 bit는 0과 1을 표현 가능 → 1 bit가 1개의 자리수가 된다.
→ bit의 개수마다 표현할 수 있는 범위가 정해져있다.
bit | Binary | Decimal | |
---|---|---|---|
1 bit | 0, 1 | 0~1 | 0~(2^1-1) |
2 bit | 00 ~ 11 | 0~3 | 0~(2^2-1) |
3 bit | 000 ~ 111 | 0~7 | 0~(2^3-1) |
4 bit | 0000 ~ 1111 | 0~15 | 0~(2^4-1) |
5 bit | 0 0000 ~ 1 1111 | 0~31 | 0~(2^5-1) |
n bit | 0~(2^n-1) |
소수부 또한 이진수로 표현한 것
Binary → Decimal
Decimal → Binary : 2씩 곱해서 정수부가 1이면 그대로 1, 정수부가 0이면 그대로 0을 작성한다. 정수부에 1만 남을 때까지 2를 곱한다.
고정 소수점의 표현범위 ⭐⭐⭐
bit | Binary | Decimal | |
---|---|---|---|
1 bit | 0.0 , 0.1 | 0~0.5 | 0 ~ 1-2^(-1) |
2 bit | 0.00 , 0.11 | 0~0.75 | 0 ~ 1-2^(-2) |
3 bit | 0.000 , 0.111 | 0~0.875 | 0 ~ 1-2^(-3) |
4 bit | 0.0000 , 0.1111 | 0~0.9375 | 0 ~ 1-2^(-4) |
5 bit | 0.0000 0 , 0.11111 1 | 0~0.96875 | 0 ~ 1-2^(-5) |
n bit | 0 ~ 1-2^(-6) |
⇒ 만약 4 bit 소프트웨어에서 0.95라는 소수를 표현하기 위해서는 근사값인 0.9375 즉, 비트로는 0.1111 을 사용해야 한다.
컴퓨터 공학에서의 고정 소수점
전체 비트수가 32bit일 때, sign(음수/양수 부호) / integer part / fractional part 의 bit가 고정되어 있는 시스템이다.
정수부와 소수부의 bit 수가 거의 비슷해서 표현 가능한 decimal 이 한정적이다.
고정 소수점과 달리 같은 32bit여도 정수부와 소수부에 할당할 bit 수를 유동적으로 바꿀 수 있는 시스템이다. → 소수점이 옮겨 다닌다(떠다닌다)고 하여 부동 소수점이다.
Decimal → Binary ⇒ 고정 소수점을 구한다.
2진수를 정규화(Normalization)한다.⭐
Normalization : 2진수의 정수부에 1만 남을 때까지 소수점을 왼쪽( $\times 2^{-1}$) 또는 오른쪽( $\times 2^{1}$)으로 옮기는 작업.
ex) 2진수로 표현된 소수에 1/2씩 곱하여 소수점을 한칸씩 왼쪽으로 옮긴다.
$$ 111.101_2=2^2+2^1+2^0+2^{-1}+2^{-2}+2^{-3}\\\xrightarrow{\times 2^{-1}}2^1+2^0+2^{-1}+2^{-2}+2^{-3}+2^{-4}=11.1101_2 \\\xrightarrow{\times 2^{-1}} 1.11101_2 $$
⇒ $111.101_2=1.11101_2 \times 2^2$
이 때, 지수(exponent)는 2이다.
Exponent part(지수부)에 지수를 할당할 때 지수의 값에 127(2^7)(=Bias)을 더하여 이진수로 표현한다. Bias를 더하는 이유 : 지수가 음수가 나올 때를 대비한 것. ⭐
ex) $111.101_2=1.11101_2 \times 2^2$ → exponent part = 2 + 127 = 129 → 1000 0001 $0.001001_2=1.001_2 \times 2^{-3}$ → exponent part = -3 + 127 = 124 → 0111 1100
Mantissa part(가수부)에 정규화한 값의 소수부를 입력한다.
ex) 111.101(2) → 0 | 1000 0001 | 1110 1000 0000 0000 0000 000
고정 소수점과의 표현범위 비교
+) 부동 소수점 64bit : sign 1bit | exponent 11 bit | mantissa 52 bit
최소 | 최대 | |
---|---|---|
고정 소수점(32bit) | -128 | 2^7-2^(-8) |
부동 소수점(32bit) | 1.17549×10^(−38) | 3.40282×10^(38) |
부동 소수점(64bit) | 2.22507×10^(−308) | 1.79769 ×10^(308) |
부동 소수점의 단점 ⭐
여전히 이진수 표현이기에 근사치를 사용하는 것이므로 일부 소수 표현이 부정확하다.
ex) 0.3(실수) → 0.30000000000000004 (부동 소수점)
1번의 문제로 인해 대수학적 특성 중 associative를 만족하지 못한다.
1번의 문제로 인해 반올림 시 오차가 발생할 수 있다. (Rounding Error)
1번의 문제로 인해 비교 연산이 부정확하다.
Overflow & Underflow : 부동 소수점 표현범위를 벗어나는 값을 저장하려 하면 무한대 또는 0으로 처리된다.
고정 소수점에 비해 구조가 복잡해 연산이 더 느리다.
⇒ python에서 실수 연산 시 정확도가 중요한 경우
decimal.Decimal
라이브러리를 사용하거나, math.isclose()
함수를 사용하여 비교연산 실행.