CS

컴퓨터의 실수 표기방법(부동소수점 표기법) + 컴퓨터의 실수 표기 오차 이유

sem; 2022. 12. 29. 11:21
반응형

오늘은 컴퓨터가 실수를 저장하는 방법인 부동소수점 표기법에 대해 알아보고자 한다.

현재 웹사이트의 개발자도구를 통해서 다음과 같은 코드를 console에 적어서 결과값을 확인해보자

0.1 + 1.1 == 1.2

이상하게도 false라는 결과값이 나올 것이다.

사람이 보았을때 서로 같은 값이지만 컴퓨터는 서로 다른 값으로 인식된다.

이는 컴퓨터의 부동소수점 표기방법에 관련이 있다.

 

이를 알기전에는 2진수에 관련된 지식이 있어야한다. 컴퓨터가 정수를 저장하는 방법으로 굉장히 쉽고 재밌는 지식이니 한번 알아보길 바란다. 2진수를 알고있다는 가정하에 진행을 하도록 하겠다.

 

5.125

를 우리가 알고있는 이진수로 변환하면 어떻게 될까?

 

101.001

다음과 같이 변하게 될 것이다.

 

이를 그대로 컴퓨터에 저장을 해도되겠지만 이대로 저장한다면 컴퓨터는 유한한 공간의 저장장치이므로 매우 넓은 범위의 실수를 저장할 수 없다.

 

또한 101.001인지 1.01001인지 소수점의 위치도 저장되어야하기에 많은 저장공간이 필요로 할 것이다.

 

이러한 문제점들로 인해 나온 실수 표기법이 부동소수점 표기법이다.

 

먼저 위의 예시를 부동소수점으로 변경해서 부동소수점에 대해 알아보도록 하겠다. 위의 예시를 부동소수점 표기법으로 바꾸게 된다면

01000000101001000000000000000000

다음과 같이 총 32bit로 나오게 된다. (굉장히 사람이 보기 어렵고 보기 싫게 생겼다..)

 

일단 왜이렇게 나왔는지 살펴보자

0|10000001|01001000000000000000000

다음은 위의 부동소수점 표기를 구간을 나눠놓기만한 것이다.

  • 첫번째 구간의 하나의 bit는 숫자의 부호를 나타낸다. 양수면 0, 음수면 1로 표현된다.
  • 두번째 구간은 총 8bit로써 exponent라고 불린다.
  • 세번째 구간은 총 23bit로써 fraction/mantissa이라고 불리운다.

이 3구간에 대해 실수를 표현하기 위해서 5.125의 이진수 실수표기법인 101.001을 하나씩 바꿔보도록 하자

 

우선 이 수는 양수이므로 첫번째 구간은 0이다.

 

그리고 이 101.001을 소수점 앞의 자리에 1만 남겨두도록 만들어 1.01001 * 2^2이라고도 표현가능하다.

 

여기서 필요한 정보는 소수점 뒤의 숫자들이 01001과 2^2에서의 지수부분인 2다.

 

먼저 소수점 뒤의 숫자인 01001은 세번째 구간인 mantissa부분에 들어가게 된다. 따라서 위의 예시처럼 23bit로

01001000000000000000000

로 나오게 된다.

 

두번째 구간은 지수부분을 이용해 만들어지는데 기본값이 127이라는 값에 지수값을 더하면 되는 것이다.

 

※ 왜 127이 기본값일까? 이는 0.0000000001을 부동소수점으로 표기할때 1.xxxxx * 2^(-20)이라고 지수가 음수가 될 수 있기에 8비트의 최대로 표시할 수 있는 숫자가 255이므로 중간값을 취해 저장하는 것이다.

 

따라서 127+2인 129라는 값을 두번째 구간에 넣으면 부동소수점 표기는 다 끝이 난다.


그렇다면 맨처음에 나왔던

0.1 + 1.1 == 1.2

는 왜 false가 나온 것일까

 

0.1을 이진수로 표시하게 되면 딱 떨어지지 않고 0.0001100110011001100110011001100110011001100110011001101.....이라는 무한한 길이의 이진수가 나오게 된다.

 

이를 부동소수점에 표현하면

00111101110011001100110011001101

32bit에 맞게 이러한 값이 나온다. 이는 당연히 저 무한한 정보를 담지 못하므로 오차가 발생하게 된다.

 

이러한 오차를 없애거나 줄이는 방법은 실수를 정수로 만들어 계산을 하거나 32bit가 아닌 더 큰 64bit형식으로 저장되는 double의 형태로 저장을 하면 오차를 현저하게 줄일 수 있다.

 

이렇게 오늘은 컴퓨터의 실수 표기 방법과 컴퓨터가 실수를 사용하게되면 왜 오차가 나는지에 대해 알아보았다.

반응형