일러두기
본 글은 국비지원 교육을 듣는 학생이 공부한 내용을 바탕으로 정리하여 적은 글입니다. 초보자가 작성한 글인만큼 내용에 다소간 오류가 있을 수 있습니다.
글의 목적
- 컴퓨터가 이해하는 유일한 숫자 0과 1, 즉 이진수에 대한 탐구를 기초적인 수준이나마 해보는 것!
- 십진수와 이진수가 어떤 관계에 있는지를 생각해보고, 특히 십진수와 이진수를 서로 변환하는 과정(=인간과 컴퓨터가 서로 상호작용하는 과정)에서 어떤 문제점(내지는 리스크)를 가질 수 있는지를 이해하는 것!
- 국비지원 선수학습에서 배운 이진수로 소수를 표현하는 방법을 블로그에 기록하고 정리하는 것!
자, 그럼 시작!
우선 수체계에 대해 조금 생각을 해보자. 중고등학교 때 공부했었던 것들을 떠올리며 아래와 같이 표현해보았다.
수는 집합관계로 이루어져 있고 가장 높은 집합인 복소수에서 가장 아랫단계(?)인 자연수까지 내려온다. 자연수는 양의 정수를 의미하며 인간이 '수'라는 개념을 처음 발견했을 때 아마도 가장 먼저 사용했던 수였을 것이다. 왜냐하면 특별히 관념적인 형태의 개념을 도입하지 않아도 이해할 수 있는 수 형태이기 때문이고, 자연수는 특히 사물을 셀 때 사용될 수 있는 수이기 때문이다.
자, 잠시 한 가지 재미있는 상황을 상상해보자. 지금 이 글을 읽는 독자분들은 10000년정도 시간을 거슬러 올라가 인류가 어떠한 수체계도 고안하지 못한 구석기 시대의 한 사회에 지금 막 도착했다. 여러분을 보고 신기해하는 마을 사람들에게 친선의 의미로 사과 20개를 선물로 가져왔는데 기술적인 결함이 생겨 사과가 30분 뒤에 도착한다고 한다. 멍하니 서 있기는 민망해서 바디랭귀지로 어떻게든 사과를 선물로 주겠다는 의미는 전달을 했는데 사과를 몇 개 준비했다는 것은 쉽게 설명이 안된다. 어떻게 해야 할까?
아마 가장 일반적인 표현방법은 손가락을 사용하는 방법일 것이다. 이에 한참을 고민하던 여러분은 바디랭귀지로 사람들에게 "잘 보세요"라는 신호를 보내 주의를 끈 후 열 손가락을 들어 보인다. 그리고 잠시 뜸을 들이곤 다시 한 번 열 손가락을 들어 보인다. 성공했을까? 약간의 긴장감이 흐르며 잠시 적막해졌다. 마을사람들은 잠시 저마다 생각을 하더니 나뭇가지를 하나 둘 모아 총 20개를 바닥에 내려놓는다. 그리곤 여러분들을 보며 씩 웃는다. 성공했다!
이처럼 인간이 수를 세기 시작하면서 발생한 자연수가 우리의 손가락 갯수인 10개를 기준으로 설정되어 있는 것은 결코 우연한 일이 아니었다. 그것은 수를 세기 시작한 인간이 초기에는 손가락 내지는 발가락을 기준으로 삼아 수를 세었기 때문에 가능한 일이었다. 그렇게 시간이 흐르고, 인간이 고안한 수체계가 점차 고도화되고 추상화되는 과정에서 10을 기준으로 하는 십진수 체계도 고도로 발전하게 되었다.
그러면 이 부분에서 한가지 정당한 의문이 떠오른다. 만약 인간의 손가락 갯수가 10개가 아니었다면 어땠을까? 가령, 만화에서 나오듯 8개였다면? 혹은 12개였다면? 어쩌면 인류는 십진수 체계가 아니라 8진수 혹은 12진수를 사용했을지도 모른다.
결국 십진수는 인간에게 가장 친숙한 수체계에 불과하다. 그리고 이는 인간의 손가락 혹은 발가락이 10개인 것에 기인한다. 과거의 인류가 손가락을 통해 수를 셀 때, 10개 이상의 수는 셀 수 없었다. 손가락이 부족하니까. 그러다보니 숫자 10 이상을 표현할 수 있는 방법을 고안할 필요가 있었다. 그리고 그게 바로 자리올림이었다. 십진수에서 자리올림의 수가 10인 것은 이러한 맥락에서 설명할 수 있다.
- 십진수 체계에서의 자리올림은 10을 기준으로 한다. (손가락은 10개니까!)
마찬가지 원리로 손가락이 2개인 돌고래 사회에서는 2개 이상의 수를 셀 수가 없었다. 돌고래 친구들도 이런 부분을 해결하기 위해 고민했고, 결국 인류가 그랬던 것처럼 자리올림이라는 개념을 만들게 된다. 다만 돌고래의 손가락은 2개이므로 인류와 다르게 돌고래 사회에서의 자리올림 수는 10이 아니라 2이다.
- 이진수 체계에서의 자리올림은 2를 기준으로 한다. (돌고래 손가락 두개!)
이런 맥락에서 보면 십진수, 이진수, 사진수, 팔진수, 16진수는 필요에 따라 각각 자리올림의 기준이 되는 수가 다를 뿐, 원리는 아주 유사하다는 것을 알 수 있다.
위의 그림은 앞서 설명한 부분을 간략하게 표현한 것이다. 왼쪽의 십진수는 10을 기준으로 자리올림이 발생하고 오른쪽의 이진수는 2를 기준으로 자리올림이 발생한다. 이와 같은 개념에서 그림 하단의 예를 보면 십진수의 217은 이진수의 1101001임을 알 수 있다.
그럼 정수의 개념을 벗어나서 유리수의 개념으로 수체계를 확대해보면 어떨까. (음의 정수는 다음에 기회가 되면 정리하도록 하자.) 십진수에서 정수가 아닌 유리수와 이진수에서 정수가 아닌 유리수는 어떻게 다를까? 결과부터 말하자면 앞서 언급한 개념과 완전히 같은 맥락이다.
위의 그림을 보면 십진수 및 이진수에서의 소수점 자리 또한 정수의 경우와 마찬가지로 10과 2를 기준으로 표현된다는 것을 알 수 있다. 즉, 십진수에서는 소수점 첫째 자리가 10-1, 소수점 둘째 자리는 10-2, 이진수에서는 각각 2-1, 2-2인 것이다. 따라서 아래의 예를 보면 십진수에서의 1.125는 이진수에서 1.001임을 알 수 있다.
십진수 소수점 이하의 값을 이진수로 변환할 때는 소수점 이하의 값에 2를 거듭 곱하면 된다! (ex. 1.12510 = 110 + 0.12510 = 12 + 1x2-310 = 12 + 0.0012 = 1.0012)
아래는 진법변환을 위한 몇 개의 연습문제이다.
- 16910 = ?2
- 10101110012 = ?10
- 23110 = ?2
- 1100110110 = ?8
- 19B16 = ?2
- 10101110012 = ?16
- 28CF16 = ?4
- 11001001011112 = ?10
5번째 문제의 해답은 다음과 같다.
16진수는 자리올림수가 16인데 십진수 체계에서는 10 이상의 수를 표현할 수 없기 때문에 10, 11, 12, 13, 14, 15에 대한 새로운 기호가 필요했다. 그래서 16진수에서는 알파벳 A부터 F까지를 10~15에 대한 수로 표현한다.
마지막으로 생각해보아야 할 부분은 십진수와 이진수를 변환하는 과정에서 발생할 수 있는 문제점이다. 이는 십진수와 이진수가 각각 가질 수 있는 유리수의 범위 및 형태가 다르기 때문에 발생하는 문제로 가령 십진수 상에서의 0.1이라는 정수가 아닌 유리수(보다 정확하게는 분수)는 이진수로 변환될 때 '무리수의 형태'로 바뀌게 된다. (마치 십진수에서 3.141592... 으로 표현할 수 있는 무리수 π처럼 이진수에서 0.1은 0.0010011001100110011... 의 형태로 값이 떨어지지 않는다.) (엄연히 말해 0.001001100110011... 은 0011이 무한히 반복하므로 순환소수이고 그렇기에 무리수가 아닌 정수가 아닌 유리수이지만 편의상 저렇게 표현하였다.)
0.1의 사례에서 볼 수 있듯 십진수와 이진수는 1:1로 호환되지 않는다. 컴퓨터와 인간은 서로 이진수와 십진수로 소통하므로 기계와 인간의 소통 간 이와 같은 부분에서 여러 문제가 발생할 수 있다. 즉, (특히 소수를 표현하는 부분에 있어) 프로그래밍 시 예상되는 결과값과 다른 오차가 발생할 수 있는 여지가 있는 것이다. 마치 외국 시를 한국어로 번역할 때 뉘앙스나 의미의 차이가 약간 발생할 수 있듯이 말이다.
이와 관련해서 흥미로운 부분은 컴퓨터 프로그래밍상에서 0.1과 0.1을 곱했을 때 0.01이 나오냐는 질문을 컴퓨터에 물었을 때 컴퓨터는 Yes(True)가 아닌 No(False)를 출력한다는 것이다. 앞서 언급했듯 십진수의 0.1은 이진수상에서 0.1과 상당히 근사한 근사치값으로 계산되기 때문인데, 이러한 값을 두 번 곱했을 때 컴퓨터가 애초에 0.01로 설정했던 값과 다른 값이 나오기 때문이다.
Q. 0.1 x 0.1 = 0.01?
- Human "Yes!!!"
- Computer "Wait.. What?"
'Computer Science' 카테고리의 다른 글
논리회로를 이용한 덧셈기 만들기 (책 code chapter 11-12 정리) (0) | 2021.08.05 |
---|