부동소수점의 구조와 원리
서론
어릴때 좋은 수학 선생님을 많이 만났고 수학을 배우면서 가장 먼저 배운거는 수의 체계였습니다. (외우느라 ㅈㄴ 맞음)
컴퓨터는 실수를 표현하는 체계를 가지고 있습니다.
Python 기준으로 실수는 보통 정수가 아닌 유리수를 표현할때 많이 사용을 했습니다..
python의 경우는 자동으로 형변환을 해주기 때문에 문제가 없기도 하죠
본론
고정소수점이란?
실수를 표현할때 소수점의 위치를 고정하는 것을 말한다.
예를 들면
a라는 자료형은 9bit 자료형이다.
여기서
부호부는 0은 양수 1은 음수를 나타내고
4bit는 총 16개의 숫자를 나타낼수 있다.
그러면 0b000010001 = 2.2가 되는것이다.
부동소수점이란?
실수를 표현할때 소수점의 위치를 고정하지 않는것을 말한다.
부동 소수점이 어려워 보이지만 예를 들어
12.345 는 0.12345 * 10^2 이되는 부동 소수점 방식으로 표현이 가능하다.
이를 2진수에 적용을 해보자!
부동소수점 만드는법
1. 부호, 정수, 소수 부로 나눈다.
2. 각 부분을 2진수로 변환한다.
3. 정수부와 소수부를 합친다.
4. 가장 앞 bit가 1이 될때 까지 소수점을 이동해준다.
5. 이동한 만큼이 지수부가 된다.
6. 부동소수점 표현 방식(IEEE754) 으로 변환해 준다.
풀어서 설명을 하면
상세 설명
예) -9.6875
1. 부호, 정수, 소수 부로 나눈다.
부호 | 정수 | 소수 |
- | 9 | 0.6875 |
2. 각 부분을 2진수로 변환한다.
정수부는 일반적인 방법으로 2진수를 도출하면된다.
0b1001
소수부는 2진수를 만드는 방법의 역순이다.
값에 2를 곱한후 1이 넘어갈 경우 1을 빼주고는 과정을 반복한다.
각단계에서 빠지는 정수값으로 2진수 값을 도출할수 있다.
해당 식을 알고리즘으로 나타내면
ix = 6875
ex = ix
qx = 10000
b_list = []
while True:
ix *= 2
if ix >= qx:
ix -= qx
b_list.append(1)
print(f"{ix} - - - 1")
else:
b_list.append(0)
print(f"{ix} - - - 0")
if ix == 0 or ix == qx or ex == ix :
break
print(b_list)
3750 - - - 1
7500 - - - 0
5000 - - - 1
0 - - - 1
[1, 0, 1, 1]
해당 값으로 도출이 가능하다.
0b1011
3. 각부분을 합친다.
0b1001.1011 이된다.
4.가장 앞 bit가 1이 될때 까지 소수점을 이동해준다.
0b1.0011011 * 2^3
(10진수는 소수점 1개가 이동할때 10^n 이기 때문에 2진수에서는 2^n을 해준다.)
5. 이동한 만큼이 지수부가 된다.
이후 정수부는 제거를 하고 소수부만 남기게 되는데 이를 가수부라고 칭한다.
2의 지수를 지수부라고 칭하면
가수부 | 진수부 |
0b0011011 | 3 =0b11 |
6. 부동소수점 표현 방식(IEEE754) 으로 변환해 준다.
sign[1bit] | Exponent[8bit] | Mantissa[23bit] |
- | 0b11 | 0b0011011 |
1 | 00000011 | 00110110000000000000000 |
= 10000001100110110000000000000000
라는 결과 값을 도출할수 있다.
'컴퓨터 공학' 카테고리의 다른 글
3차 함수와 알고리즘 (1) | 2023.01.11 |
---|---|
1차 함수와 가우스 기호 알고리즘 응용 (0) | 2023.01.11 |