본문 바로가기

BackEnd/C

정수와 실수의 표현 방식

반응형

1. 정수의 표현 방식


컴퓨터가 데이터를 표현하는 방식은 약속이다. 


1과 0이 메모리공간에 저장되어있는 걸 보고 정수인지, 실수인지, 문자인지 알 수 없다.


어떤 약속에 의해 데이터가 저장되었고, 그 데이터를 참조할때도 약속된 형태에 따라서 해석을 하


기 때문에 정수가 될수도, 실수가 될 수도 있다. 


그래서 가장 기본이되는 정수와 실수의 표현 방식이 어떻게 약속되어 있는지 봐보자


정수와 실수 둘은 데이터 저장방식이나 참조방식이 다르다.




1) 양의 정수 표현 방식


양의 정수 표현에 사용되는 바이트 수가 커지면 , 표현할  있는 정수 값의 범위가 증가한다.


바이트수에 상관없이 맨 앞은 부호비트(msb)로서 0은 양의 정수를 나타내고,


나머지는 데이터의 크기를 나타낸다. 밑의 그림은 1바이트 기준으로 +11을 나타낸다.





2) 음의 정수 표현 방식


    위 그림의 양의 정수에  2 보수를 취한 결과를 음의 정수라고 사용하기로 약속했다.


    1의 보수는 0을 1로 1은 0으로 바꾼것이다.


2의 보수는 1의보수에 1을 더한 것이다.



왜 2의 보수를 취한 결과가 음의 정수라고 약속했냐면, 


     양의 정수와 음의 정수의 합이 0 이기 때문이다. 올림수는 일단 버린다.



2. 실수의 표현 방식


 1)  실수 표현의 문제점과 해결책


   0과 5사이에 존재하는 정수의 개수는 몇개인가? 5개이다.


   0과 5사이에 존재하는 실수의 개수는 몇개인가? 무한대이다..


   예)0.00000000000000274..


   메모리공간은 한계가 있다. 그래서 모든 실수를 완벽히 표현 못한다.


   완벽히 표현 못하니 정밀도를 포기하고근사치만 표현하기로 한다.


   대신에 보다 더 데이터 범위를 폭넓게 표현할수 있다.


   근사치 표현을 위해서 IEEE 표준위에서 하나의 수식을 도출했다.


   모든 컴퓨터는 실수를 표현할때 이 수식을 써야한다고 약속했다.



     만약 위 그림과 같이 2 바이트를 가주고 실수를 표현해야 한다고 할때,


m과 e의 값을 채워서 실수를 표현하자고 한것이다. 


만약 3.15를 저장한다고 하면 3.15가 되기 위한 m과 e를 구한다.


그리고 가장 근사합 값을 계산해서, m과 e 값만을 저장 하는것이다.


내부적으로 시스템은 실수의 계산을 위해 이 수식을 인식, 기억 하고 있다.


그리고 실수를 저장하거나 참조할때도 이식을 기준으로 계산이 이루어진다.


참조할때는 m과 e의 값을 수식에 넣으면 가장 근사한값이 나오게된다.


결국 실수의 표현에는 2의 지수승이 들어가면서 어마한 계산이 필요하다는 결론도 도출된다.


그래서 나중에 실수를 표현할때 과연 이것이 실수로 표한할만한 


가치가 있는것인가를 판단해봐야한다.


그리고 근사치로 표현하는 방식이라 실수를 표현하는데 있어서 오차가 존재하는 것은 당연한 


일이며, 이러한 오차를 가리켜 부동소수점 오차라 하는데, 이는 컴퓨터의 실수 표현방식이 부동


소수점 방식이기 때문이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
int main(void)
{
    int i=0;
    float real;
    
    real=0;
    for(i=0; i<30; i++)
        real=real+0.1;
    
    printf("0.1을 30회 더한 결과: %f \n", real);
 
    return 0;
}
cs

1
0.1을 30회 더한 결과: 2.999999
cs


2.999999로 오차가 발생했다.

반응형