계산기코어 2.1 뜯어보기 2강. 오류와 입력처리
안녕하세요? noname01입니다.
지난강의에 이어 2강을 시작하도록 합시다. 만약 계산기코어 2.1 설명서를 읽지 않으셨다면
한번정도 읽고 오신후 이 글을 읽으면 이해하는데 도움이 될 수 있습니다.
(링크는 1강에 있습니다.)
계산기코어 2.1에서는 총 12개의 변수를 사용하는데 데스값에 해당하는 유닛으로 표현하면
이름이 너무 길어서 불편하므로 수학에서처럼 알파벳 하나로 변수를 표현하도록 하겠습니다.
아래 배치는 용도에 따라 배치해본 것입니다.
T r R
t
a c b x X
A C B
여기서 T는 임시 저장 공간입니다. 예를들어 A의 값을 a로 복사할때 다음과 같은 과정을
거칩니다.
T = a = A; A = 0;
A = T; T = 0;
한줄에 있는 작업은 동시에 동작되는데, C언어로 해석하면 "왜 저렇게 만들지?" 하는 생각이
들겠지만 트리거를 많이 작성해 보신 분이라면 왜 저렇게 되는지 잘 아실겁니다. 이와 같은
경우처럼 트리거 한 주기 내에 순간적으로 값의 저장이 필요할때 변수 T를 사용합니다.
A와 B는 계산에 필요한 숫자들을 입력받는 변수입니다. 예를들어 10과 20을 더하든지 빼든지
연산을 할때 A에는 10을 B에는 20을 넣어줍니다.
C는 여러가지 역할을 한꺼번에 담당합니다. 외부적으로 볼땐 수행하고자 하는 계산의 종류를
입력받는 역할만 하는것 처럼 보이지만 내부적으로는 오류처리와 호출의 순서를 제어하는
제어변수의 역할까지 하게 됩니다. 이는 이 변수의 영역을 여러개로 나누고 각 영역에 역할
을 부여하는 방식으로 되어 있습니다. 이것이 가능한 이유는 각 역할들이 동시에 작동할
필요가 없기에 가능합니다. 입력이 다 끝난 후에 계산이 수행될테니 계산 종류를 입력받는
역할을 끝마친 뒤에 제어변수의 역할을 수행할 것이며 오류가 발생할 경우 더이상 계산을
수행할 필요가 없으므로 오류처리중에는 제어변수의 역할을 할 필요도 없겠죠.
이 변수 C의 용도별 범위는 다음과 같습니다.
첫 줄은 수행하고자 하는 계산의 종류에 대응하는 코드입니다. 즉 0~11까지는 수행하고자
하는 계산의 종류를 입력할때 사용되는 범위입니다.
↓
0 - - ready
1 - - reset
2 1000 ~1001 +
3 1010 ~1011 -, >, =, <
4 1020 ~1021 *
5 1190 ~1235 /, %
6 1050 ~1059 √
7 1060 ~1061 ^
8 1070 ~1071 !
9 1080 ~1083 nPr
10 1090 ~1098 nCr
11 1100 ~1104 rand()%n;
↑ ↑
두번째줄부터 세번째줄은 각 계산에 사용되는 제어변수의 범위를 표시합니다. 즉
1000부터 1001까지는 덧셈을 제어하기 위해 사용되는 구간이며,
1190부터 1235까지는 나눗셈(나머지계산)을 제어하기 위해 사용되는 구간입니다.
만일 A와 B에 값을 입력한 뒤 C에다 5를 입력할 경우 C의 값을 1190으로 점프시키고
그뒤 1190부터 1235범위 내에서 C의 값이 변하며 A를 B로 나누는 과정을 제어합니다.
이렇게 값을 한번 입력받아 다시 점프시키는 이유는 일단 처음 C에 계산종류를 입력할때
코드가 간단해 집니다. 사칙연산만 보더라도 더하기, 빼기, 곱하기, 나누기 순서대로
2, 3, 4, 5의 코드를 갖고 있죠. 만약 이렇게 하지 않으면 제어 변수의 역할때문에
연속적이지 않고 듬성듬성한 코드를 갖게 되는데 이러면 안그래도 기억하기 힘든 코드를
기억하기가 더욱 힘들어지겠죠?
또다른 이유로는 호환성이 있습니다. 만약 알고리즘이 바뀌었는데 할당되어있던 제어변수의
범위가 부족해진다면 다른 영역에 더 넓은 범위로 다시 할당받아야겠죠?? 이때 점프되는
숫자만 새로 할당받은 범위로 지정해주면 연산 종류를 입력할때 사용하는 연산종류코드는
바꾸지 않아도 되겠죠??
실제로 계산기코어 2.0에서 계산기코어 2.1로 수정하면서 나눗셈 알고리즘이 수정되었는데
이때 이런 설계상 이득을 본적이 있죠. 그래서 나눗셈 제어변수 범위만 혼자 제일 큰
1190부터 시작하는 이유입니다. 2.0버전에선 나눗셈 제어변수 범위의 시작이 1030이었
답니다. 이렇게 버전업이 되면서 제어변수의 범위가 달라졌지만 두 버전에서 나눗셈을
계산하기 위해서는 똑같이 C에 5라는 값을 넣어 주기만 하면 됩니다.
만일 계산중이나 계산시작전 오류가 발견되면 C의 값은 다음과 같이 변합니다.
↓
995 정의되지 않은 연산코드 입니다.
996 올바르지 않은 연산입니다.
997 0^0은 정의되지 않은 수입니다.
998 계산 가능 범위를 초과하였습니다.
999 0으로 나누었습니다.
C값이 이 범위에 들 경우 해당하는 오류 메시지를 띄운 뒤 C의 값이 1로 점프되며,
위의 목록에도 있듯이 C의 값이 1일 경우 12개의 변수를 모두 0으로 리셋하며 계산이
정지됩니다.
a와 b는 전체적인 계산을 수행하기 위해 필요한 내부 계산을 하기 위한 수를 저장합니다.
예를들어 팩토리얼을 계산하기 위해서는 반복해서 곱하기 연산을 수행해야 하는데,
이때 A에 10을 입력할 경우 a에는 차례대로 10, 9, 8, ... 1 까지의 숫자가 대입되며
b에는 누적계산한 결과가 대입되어 반복적으로 곱셈하여 10!의 값을 구해냅니다.
변수 c는 1강에서 살펴보았던 호출에 사용되는 변수입니다. c값에 호출하고자 하는 트리거의
코드를 더해주면 해당 트리거가 호출됩니다.
변수 X와 x는 계산 완료 후 계산 결과가 대입되는 변수입니다. 통상적으로 x에는 0이 X에는
계산 결과가 대입되지만 계산 결과가 2개인 연산은 x에도 계산 결과가 대입됩니다.
계산 결과가 두개인 연산은 나눗셈과 뺄셈이 있는데 나눗셈의 경우 x에는 나머지가, X에는
몫이 대입되며, 뺄셈의 경우에는 x에는 비교값이, X에는 a와 b의 차가 대입됩니다. 비교값에
대한 자세한 설명은 1강의 마지막 부분을 참고해 주세요.
나머지 변수들(t, r, R)은 계산도중 중간에 기억해야할 수들을 대입받아두는 역할을 합니다.
이번에는 '계산기코어 2.1'에 사용되는 변수와 그 용도, 그리고 변수 C에서 어떤 방식으로
입력과 오류처리를 하는지에 대해서 알아 보았습니다. 다음 강의 부터는 덧셈부터 시작하여
본격적으로 계산 알고리즘을 한번 살펴보도록 합시다.
[50]계산기코어 2.1 뜯어보기 1강. 전체구조와 호출방식
[50]계산기코어 2.1 뜯어보기 2강. 오류와 입력처리
[50]계산기코어 2.1 뜯어보기 3강. 덧셈, 뺄셈, 곱셈
[50]계산기코어 2.1 뜯어보기 4강. 나눗셈
[50]계산기코어 2.1 뜯어보기 5강. 제곱근
[50]계산기코어 2.1 뜯어보기 6강. 거듭제곱, 팩토리얼, 순열
[50]계산기코어 2.1 뜯어보기 7강. 조합
[50]계산기코어 2.1 뜯어보기 8강. 난수 생성