본문 바로가기
IT 기술/컴퓨터관리 팁

[유틸] dc 간단 사용법

by 땅뚱 2013. 1. 8.

dc 라는 계산기 유틸이 있다는 것은 예전부터 알고 있었다. 하지만, 사용법은 잘 모르고 있었는데, 웹에서 뭔가를 찾아보다가 누군가 자신이 한 작업을 올려놓았는데, 무슨 얘기인지 하나도 알아 먹을 수가 없어서 간단하게 사용 방법을 찾아보았다.

man page 를 참조해보면 다음과 같다.

dc는 정확도를 무제한으로 계산할 수 있는 reverse-polish 방식의 계산기이다.(참고: reverse-polish notation은 역폴란드 표기법이라고 번역할 수 있는데, 후위 표기법(postfix notation)이라고도 한다. 즉 모든 연산자는 피연산자의 뒤에 나오는 방식이다. 보통 우리가 쓰는 표기법은 연사자가 피연산자 사이에 들어가는 infix notation 이다. 폴란드 표기법은 반대로 연산자를 피연산자 앞에 쓰는 전위 표기법(prefix notation) 이다.)

매크로를 정의해서 사용할 수도 있다. 매크로 설명은 생략한다.

역폴란드 방식 계산기는 숫자를 스택에 저장한다. 숫자를 입력함으로써 스택에 저장하고, 연산자가 스택으로부터 꺼내어 계산하고 그 결과를 다시 스택에 넣는다.

dc 에서 숫자를 입력하기 위해서는 수를 type 하면 된다. 16진수의 경우에 대문자 A~F 를 사용한다. 지수표현은 지원하지 않는다. 마이너스 값을 표현하기 위해서 '_' 를 사용한다 '-' 는 마이너스 연산자로 인식한다. 두 개의 숫자를 연달아 입력하는 경우 스페이스나 newline 으로 구분한다. 

자주사용하는 명령어를 알아보자

* 컨트롤 매개변수

k - 스택에서 꺼내어 해당값으로 정밀도를 설정한다.
i - 스택에서 꺼내어 해당값으로 진수를 입력으로 설정한다.
    (16 i --> 입력의 16진수 설정 : 16 을 스택에 넣고 꺼낸 후에 그 값을 입력값의 진수로 설정한다.)
o - 스택에서 꺼내어 해당값으로 진수를 출력으로 설정한다.
    (16 o --> 출력의 16진수 설정 : 16을 스택에 넣고 꺼낸 후에 그 값을 출력의 진수로 설정한다.)
K, I, O - 위와 동일하지만, 현재의 정밀도, 입력 진수값, 출력 진수값을 스택에 넣는 명령이다.
    (dc 실행후 바로 I 명령을 치고 p 를 해보면 10 이라는 숫자가 보이는데, 이는 최초 입력 진수값인 10 을 I 명령에 의해서 스택에 넣은 것이다)

* 출력명령

p - 스택의 top 값을 출력한다. 스택은 변경되지 않는다.
n - 스택의 top 에서 값을 꺼내어 출력한다. newline 은 출력되지 않는다.
f - 스택에 저장된 값을 보여준다. 스택은 변경되지 않는다.

* 레지스터

sr : 메인 스택의 top 을 pop 하여, r 레지스터에 저장한다.
lr : 레지스터 r 의 값을 메인 스택에 push. 레지스터 r 의 값은 변경되지 않는다.
Sr : 메인 스택의 top 을 pop 하여, r 레지스터에 push 한다. 이전 r 레지스터의 값은
Lr : 레지스터 r 의 값을 꺼내어 메인 스택에 push 한다. 이전 r 레지스터의 값은 lr 로 접근 가능하다.

* 스택 제어

c : 스택을 clear 한다.
d : 스택의 top 값을 복제해서 스택에 넣는다. 4d*p 는 4 * 4 를 의미한다.
r : 스택의 top 에 있는 두 개 값의 순서를 바꾼다.

* 연산

+, * : 스택의 두 값을 꺼내어 더하고(곱하고), 결과를 스택에 넣는다.
- : 스택의 두 값을 꺼내어 2nd - 1st 하고 결과를 스택에 넣는다.
/ : 스택의 두 값을 꺼내어 2nd / 1st 하고 결과를 스택에 넣는다.
% : 스택의 두 값을 꺼내어 나머지 값을 스택에 넣는다. Sd dld/ Ld*- 와 동일한 결과를 얻는다.

 

아래에 예제로 확인하면 바로 이해가 될 것이다. 예제는 위에서 순서대로 타이핑했을 경우에 대한 설명을 기록하였다.

* 예제

3k                       정밀도를 소수점 3자리까지 (3을 스택에 넣은 후, 그 값을 꺼내어 정밀도로 설정함)
8011776 131072/p
                           8011776과 131072 를 스택에 넣고 스택에서 차례대로 꺼내어 2nd / 1st 의 값을 계산('/')하여 스택에 넣고 그 값을 출력한다(p) : 실제 계산 내용 (8011776 / 131072)
61.125                방금전 계산에 의하여 stack 에 넣어진 값
61-p                    61을 스택에 넣고 차례로 스택에서 꺼내어 2nd - 1st 을 계산하여 스택에 넣고 값을 출력한다. (61.125 - 61)
.125                    이전 계산에 의해서 stack 에 넣어진 값
131072*p            131072 를 스택에 넣고 차례로 꺼내어 1st * 2nd 계산하여 스택에 넣고 값을 출력한다.(0.125 * 131072)
16384.000          이전 계산에 의해서 stack 에 넣어진 값
512/p                  512 를 스택에 넣고 차례로 꺼내어 2nd / 1st 를 계산하고 스택에 넣고 값을 출력한다.(16384 / 512)
32.000                이전 계산에 의해서 stack 에 넣어진 값
96r                      96을 스택에 넣고 스택의 두개 값을 바꾼다(reverse order) 2nd->1st, 1st->2nd
-p                        스택에서 값을 차례로 꺼내어 2nd - 1st 를 계산하고 스택에 넣고 값을 출력한다. (96 - 32)
64.000                이전 계산에 의해서 stack 에 넣어진 값
q                         dc quit