먼저 오차원인을 간단하게 말하면
컴퓨터는 2진수로 모든걸 다루기 때문에 소수도 2진수로 변경해서 값을 다루게되는데
이 변경하는 과정에서 오차값이 생긴다고 말할수있다.
이 변경하는 과정을 좀 더 설명하자면
일단 컴퓨터가 실수를 다루는 방법은 대중적으로 2가지가 있다
- 고정 소수점 방식
- 부동 소수점 방식
고정 소수점 방식보다 더 정밀하게 표현하기 위해 부동 소수점 방식이 나왔다
주로 사용하는 실수 자료형에서 보면
float은 총32bit로 단정도라 하며
/ 1bit 부호비트 / 8bit 지수부 / 23bit 가수부 / 로 이루어져 있다
double은 총64bit
/ 1bit 부호비트 / 11bit 지수부 / 52bit 가수부 / 로 이루어져 있다
이 부동소수점 형태로 소수를 이진수로 변경하여 저장하는 과정은 크게 세가지다.
"11.6"을 단정도로 예시를 들면
1.일단 정수부와 소수부로 나누어 이진수로 변경
정수부 | 소수부 | |
10진수 | 11 | 0.6 |
2진수 | 1011 | 1001... (무한소수로 반복됨) |
여기서처럼 소수부가 이진수로 변환되면 무한소수가 될때가 있다.(모든 수가 그런건 아님)
끝없이 값을 저장할 수 는 없으므로 어딘가에서 끊어주고 그 뒤의 값을 버려야 하는데
이처럼 값을 버리는 과정에서 오차가 나게된다.
11.6 => 1011.1001....이다
2.정수부에 1만 남기도록 소수점을 이동하여 정규화하여 지수부와 가수부를 나눈다
여기서 소수점을 이동시키는게 정규화라 하였는데
이곳 뿐만아니라 여러곳에서 정규화를 한다는건 서로 비교할때 굉장히 편리하였는데 여기도 마찬가지고
추가로 조금더 비트를 절약하여 그만큼 정밀도가 향상되기 때문이다.
아무튼, 이동시키면 1.0111001.... 이며 소수점 뒤에있는 수가 가수부가 된다.
가수부는 단정도에서 11bit이므로 11bit만큼 채워주거나 잘라준다
1.01110011001 이된다.
(가수부는 "01110011001" 임)
그 후 소수점을 이동한 만큼 지수부가 결정된다.
이동한 거리는 3칸으로 지수는 3이다.
(만약 반대방향이였으면 -3)
지수부는 총 8bit로 3의 값을 가진다. 하지만 상대는 컴퓨터이므로 이진수화 해준다.
3은 이진수로 0000 0011이지만 놀랍게도 이 값에 bias값이라는걸 더하여 저장한다.
3.지수부에 bias값을 더함
지수가 음수일 경우도 있기 때문에 탄생한 하나의 음수 표현법이라 보면 된다.
[지수의 2진수 + bias값 = bias표현법]
2의 보수나 부호 비트처럼 음수를 표현하는 방법이 있는데
"왜 굳이 bias표현법을 사용하는가"라 한다면 사실 아직 잘 모르겠다.
여러 의견을 보았는데 확실 하지 않은거 같아 지금 상태에서는 이러한 표현법으로 저장한다 라고 알아둬야겠다.
bias값은 2^(n-1)-1 으로 계산한다.
[n은 지수부의 비트 수]
8bit의 bias표현 법에서 표현가능한 지수는 -127 ~ 128 이다
0000 0000 = 지수-127 + bias127
0000 0001 = 지수-126 + bias127
...
1000 0000 = 지수0 + bias127
1000 0001 = 지수1 + bias127
...
1111 1111 = 지수128 + bias127
그럼 위에서 나온 3의 이진수인 0000 0011과 단정도의 bias값인 0111 1111(127)을 더하면
1000 0010으로 지수부에 저장된다.
그럼 우리가 위에서 나온 3이 최종적으로 정리되는 형태는
0 / 1000 0010 / 01110011001 형태로 저장이 된다.
가장 설명이 좋았던 곳
'공통' 카테고리의 다른 글
Logical memory & physical memory (0) | 2021.06.05 |
---|