컴퓨터 자료2013. 12. 28. 15:45

반응형

사람은 풀 수 있지만 컴퓨터로는 정답을 구할 수 없는 문제가 있다. 


이 문제는 컴퓨터 프로그래밍을 맨 처음 배울때 흔히 접하는 내용이다. 


0.1을 100번 더한 값을 구하는 문제인데, 우리는 그 답이 10 이라는 것을 단번에 알 수 있지만 컴퓨터는 10 이 아닌 10 의 근사값을 답으로 낸다. 


이 현상의 원인은 컴퓨터가 2진수를 연산에 사용하기 때문이다.


우리가 사용하는 10진수 123.456 를 살펴보면, 123.456 의 1은 102자리의 수 이고, 2는 101자리의 수, 3은 100 자리의 수 이다.


소숫점 아래의 456에서 4는 10-1자리의 수 이고, 5는 10-2, 6은 10-3 자리의 수 이다.  


이진수도 마찬가지로, 101.011 이 있다고 가정하면..


101.011 의 1은 22자리의 수 이고, 0는 21자리의 수, 1은 20 자리의 수 이다. (4+1=5)


소숫점 아래의 011에서 0는 2-1자리의 수 이고, 1는 2-2, 1은 2-3 자리의 수 이다.  (0.25 + 0.125 = 0.375)


2-2 은 1/ 22 이므로 1/4 이다.


즉, 2진수로 나타낼 수 있는 소숫점 아래의 10 진수는 1/2 (0.5), 1/4 (0.25), 1/8 (0.125), 1/16 (0.0625) 가 될 수 밖에 없고, 이 숫자들을 조합해서 10진수 0.1 을 나타내야 하므로 10진수 0.1 은 2진수로는 무한소수가 된다. 


따라서, 컴퓨터는 근사값을 계속 더하게 되어 정답인 10을 구하지 못하고 근사값을 구하게 되는 것이다.


01.htm


위의 01.htm 파일은 아래의 내용을 실행해보는 파일이다.


<script>

var sum = 0;

for(i=0;i<100;i++)

{

sum += 0.1;

}

document.write(sum);

</script>


위의 스크립트를 실행하면 10 이 나오지 않고, 9.99999999999998 과 같은 10의 근사값을 출력한다. 


반응형
Posted by 블루토파즈