사람은 풀 수 있지만 컴퓨터로는 정답을 구할 수 없는 문제가 있다.
이 문제는 컴퓨터 프로그래밍을 맨 처음 배울때 흔히 접하는 내용이다.
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 파일은 아래의 내용을 실행해보는 파일이다.
<script>
var sum = 0;
for(i=0;i<100;i++)
{
sum += 0.1;
}
document.write(sum);
</script>
위의 스크립트를 실행하면 10 이 나오지 않고, 9.99999999999998 과 같은 10의 근사값을 출력한다.
'컴퓨터 자료' 카테고리의 다른 글
스마트폰별 agent 값 목록 (0) | 2014.01.12 |
---|---|
0000 부터 9999 까지 출력하는 스크립트 (0) | 2014.01.08 |
매개변수를 확인하는 프로그램을 만들어 보았다. (0) | 2013.11.23 |
공유기 수리 일지 (0) | 2012.02.12 |
압축을 해서 파일 크기가 더 커지는 경우 (0) | 2011.10.02 |