0.1을 2진수로 변환해서 10번 더하면 1이 되는가?

0.1을 2진수로 변환해서 10번 더하면 1이 되는가?

0.1을 2진수로 변환하면 0.00011001100… 이렇게 무한 반복을 하게 됩니다. 이런 수를 10번 더하면 과연 1이 될까요?

간단한 프로그램을 짜서 실행해보았습니다.


float sum = 0.0;
int i=0;
for(i=0; i<10; i++)
{
  sum += 0.1
}
print(sum-);


하지만 결과는 기대와는 다르게 0.999999999999999999... 이런식으로 1이 아닌, 1과 가장 근사한 실수가 출력 될겁니다.

이해를 돕기 위해서, 실수부를 4비트만 있다고 가정하면, 2진수 0.1000은 10진수로 바꾸면1*(2^-1), 즉 0.5가 됩니다. 0.0100 = (0*2^-1) + (1*2^-2) + (0*2^-3) + (0*2^-4) = 0 + 1*(1/4) + 0 + 0 =  0.25가 됩니다.
이런식으로 4비트의 2진수로 표현 할수 있는 경우의 수는 2^4 = 16가지 입니다.


----------------------------------------------------------------------------

2진수                            수식                                 결과(10진수)

----------------------------------------------------------------------------

0.0000 = 0*(1/2) + 0*(1/4) + 0*(1/8) + 0*(1/16) =  0
0.0001 = 0*(1/2) + 0*(1/4) + 0*(1/8) + 1*(1/16) =  0.0625
0.0010 = 0*(1/2) + 0*(1/4) + 1*(1/8) + 0*(1/16) =  0.125
0.0011 = 0*(1/2) + 0*(1/4) + 1*(1/8) + 1*(1/16) =  0.1875
0.0100 = 0*(1/2) + 1*(1/4) + 0*(1/8) + 0*(1/16) =  0.25
0.0101 = 0*(1/2) + 1*(1/4) + 0*(1/8) + 1*(1/16) =  0.3125
0.0110 = 0*(1/2) + 1*(1/4) + 1*(1/8) + 0*(1/16) =  0.375
0.0111 = 0*(1/2) + 1*(1/4) + 1*(1/8) + 1*(1/16) =  0.4375
0.1000 = 1*(1/2) + 0*(1/4) + 0*(1/8) + 0*(1/16) =  0.5
0.1001 = 1*(1/2) + 0*(1/4) + 0*(1/8) + 1*(1/16) =  0.5625
0.1010 = 1*(1/2) + 0*(1/4) + 1*(1/8) + 0*(1/16) =  0.625
0.1011 = 1*(1/2) + 0*(1/4) + 1*(1/8) + 1*(1/16) =  0.6875
0.1100 = 1*(1/2) + 1*(1/4) + 0*(1/8) + 0*(1/16) =  0.75
0.1101 = 1*(1/2) + 1*(1/4) + 0*(1/8) + 1*(1/16) =  0.8125
0.1110 = 1*(1/2) + 1*(1/4) + 1*(1/8) + 0*(1/16) =  0.875
0.1111 = 1*(1/2) + 1*(1/4) + 1*(1/8) + 1*(1/16) =  0.9375


즉, 4비트의 2진수로 표현 할수 있는 모든 수는

1*(2^-1) = 1*(1/2) = 0.5
1*(2^-2) = 1*(1/4) = 0.25
1*(2^-3) = 1*(1/8) = 0.125
1*(2^-4) = 1*(1/16) = 0.0625

이 4개의 수의 조합(덧셈)으로 표현 할 수 있는 수 밖에는 없습니다. 이 이외의 수는 표현할 수 없다는 뜻이 되죠. (가정을 바꿔서 더 많은 비트를 사용한다 해도 큰 차이 없습니다. 좀더 근사값으로 변할 뿐… 실제로 수학관련 서적을 찾아보면 ‘연속된 10진수를 2진수로 표현할 수 없다.’는 구절이 있습니다.)

어떤 조합이 나오더라도 0.1이 만들어 질수 없기 때문에 0.1이 아닌 가장 가까운 수를 10번 더하더라도 0.1로 10번 더한 1이 나올수 없는 겁니다.

그럼, 0.1의 2진수를 10번 더해서 1이 될수는 없는가?

될수 없는건 아닙니다. 0.1의 경우에서만은 가능한 방법이 있습니다. 바로 부동 소수점을 이용해서 접근하는 것이죠.

0.1의 경우 1*(10^-1)을 이용해서 계산을 하면 답을 도출할수 있습니다. 단, 0.1인 경우에서만 말이죠.

예를 들어 1.1이나 2.1, 3.1의 경우는 부동 소수화를 해도 소수부분이 0.1이기 때문에 앞서 설명한데로 무한 반복하게 됩니다.

---

이상 Digital System 과제 였습니다.

by allyouneed | 2007/04/07 00:20 | 트랙백 | 덧글(0)

트랙백 주소 : http://allyouneed.egloos.com/tb/3515802
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶