DC(1)

명칭
dc - 임의 정밀도의 계산기

서식
dc [-V] [--version] [-h] [--help]
   [-e scriptexpression] [--expression=scriptexpression]
   [-f scriptfile] [--file=scriptfile]
   [file ...]

해설

dc 는, 역폴란드 형식의 무한 정밀도의 계산을 실시할 수 있는 탁상 계산기입니다. 이 계산기는, 정의나 매크로 호출도 실시할 수 있습니다. 보통,dc 는 표준 입력으로부터 읽어들입니다. 명령행 인수가 주어졌을 때는, 그것은 파일명이 되어, dc 는 그 파일을 읽어들여, 파일의 내용을 실행한 다음에, 표준 입력으로부터 입력을 취합니다. 통상의 출력은 모두 표준 출력에, 에러 출력은 모두 표준 에러 출력에 보내집니다.

역폴란드 기법 계산기는, 수를 스택에 보존합니다. 숫자를 입력하면(자), 그것을 스택에 쌓아올립니다. 계산 조작은, 인수를 스택으로부터 꺼내, 결과를 스택에 쌓아올립니다.

숫자를 dc 에 입력하기 위해서는, 숫자 (소수점이 있어도 상관하지 않습니다)를 입력합니다. 지수 표현은 서포트되고 있지 않습니다. 부의 숫자를 입력하기 위해서는,``_''로 시작되는 숫자를 입력합니다. ``-''는 감산의 2항연산자로서 사용되고 있으므로, 이 때문에 이용할 수 없습니다. 계속해 2 개의 숫자를 입력하기 위해서는, 사이에 공백 캐릭터나 개행 캐릭터를 입력합니다. 이것들은, 명령로서의 의미는 없습니다.

옵션
dc 는, 다음의 명령행 옵션 첨부로 기동 가능합니다:

-V

--version
    실행된다 dc 의 버젼과 저작권 정보를 표시해, 종료합니다.

-h

--help
    이러한 명령행 옵션을 짧게 정리한 메세지와 버그 보고 주소를 표시해, 종료합니다.

-e script

--expression=script
    script 안의 명령을, 입력 처리중에 실행하는 커멘드 집합에 추가합니다.

-f script-file

--file=script-file
    파일 script-file 안의 명령을, 입력 처리중에 실행하는 커멘드 집합에 추가합니다.

상기 옵션의 처리 후에 명령행 파라미터가 남았을 경우, 이러한 명령행 파라미터는 처리 대상의 입력 파일명으로서 해석됩니다. 파일명 - (은)는, 표준 입력 스트림을 가리킵니다. 파일명을 지정하지 않으면 표준 입력이 처리됩니다.

표시 명령

p   스택을 변경하는 일 없이, 스택의 선두의 값을 표시합니다. 개행 캐릭터가, 수치의 뒤에 표시됩니다.

n   스택의 선두의 값을 표시해, 스택으로부터 꺼냅니다. 개행 캐릭터는, 후에 표시되지 않습니다.

P   스택의 선두의 값을 스택으로부터 꺼냅니다. 값이 캐릭터 라인의 경우, 말미의 개행을 붙이지 않고 , 단지 표시합니다. 그렇지 않은 경우, 이것은 수치이며, 수치의 절대치의 정수 부분이, "기수 (UCHAR_MAX+1)" 의 바이트 스트림로서 표시됩니다. 여기서 (UCHAR_MAX+1)는 256 을 가정하면(자) (대부분의 머신에서는 8 비트 바이트이므로), 캐릭터 라인 KSK 0k1/ [_1*]sx d0>x [256~aPd0<x]dsxx sxLKk 도 또한 이 기능을 실현합니다만, x 레지스터를 잡아 버리는 부작용이 다릅니다.

f   변경하는 일 없이, 스택의 내용 전부를 표시합니다. 이것은, 잊어 버렸을 때에 사용하거나 있는 명령이 어떠한 효과를 가져오는지를 알고 싶을 때로는, 좋은 명령입니다.

계산

+   2 개의 값을 스택으로부터 꺼내, 가산을 실시해, 결과를 스택에 쌓습니다. 결과의 정밀도는, 인수의 값에만에 의해 정해져, 충분히 정확합니다.

-   2 개의 값을 꺼내, 최초로 꺼낸 값을 2 번째에 꺼낸 값으로부터 당깁니다. 그 후, 결과를 스택에 쌓습니다.

*   2 개의 값을 꺼내, 곱셈을 실시해, 결과를 스택에 쌓습니다. 결과의 소수의 자리수는, 현재의 정밀도치 (이하 참조) 와 2 개의 인수의 소수의 자리수에 의존합니다.

/   2 개의 값을 꺼내,2 번째에 꺼낸 값을 최초로 꺼낸 값으로 나누어, 결과를 스택에 쌓습니다. 소수의 자리수는, 정밀도치에 의해 지정됩니다.

%   2 개의 값을 꺼내, / 그리고 계산된 나눗셈의 나머지를 계산해, 결과를 스택에 쌓습니다. 계산되는 값은, 캐릭터 라인 Sd dld/ Ld*- 으로 계산되는 값과 같습니다.

~   2 개의 값을 꺼내,2 번째에 꺼낸 값을 최초로 꺼낸 값으로 나누어, 그 상을 먼저 스택에 쌓아, 계속되어 나머지를 쌓습니다. 나눗셈에 사용되는 소수의 자리수는, 정밀도치에 의해 지정됩니다. (에러 체크 기구는 조금 다릅니다만, 캐릭터 라인 SdSn lnld/ LnLd% 도 이 기능과 같게 일하겠지요. )

^   2 개의 값을 꺼내, 최초로 꺼낸 값을 지수로 해, 2 손톱의 값을 바닥으로서 지수 계산합니다. 지수의 소수점 이하는 무시됩니다. 정밀도치는, 결과의 소수의 자리수를 지정합니다.

|   3 개의 값을 꺼내, 나무 잉여 (modular exponentiation) 를 계산합니다. 최초로 꺼낸 값은 법 (reduction modulus) (이 값은 0 이외의 정수로 없으면 안됩니다. ),2 번째에 꺼낸 값은 지수 (이 값은 비부의 숫자가 아니면 안되어, 소수점 이하는 무시됩니다. ), 3 번째에 꺼낸 값은 누승되는 바닥으로서 이용됩니다. 이것은 정수여야 합니다. 작은 정수에 관해서는, 이 기능은 캐릭터 라인 Sm lble^ Lm% 과 같이 일합니다. 그러나,^ 를 사용하는 경우와 달라, 이 명령은 지수가 매우 커도 일할 것입니다.

v   1 개의 값을 꺼내, 평방근을 요구해 결과를 스택에 쌓습니다. 정밀도치는, 결과의 소수의 자리수를 지정합니다.

대부분의 연산자는,``정밀도치'' 에 영향을 받습니다. 정밀도치는, k 명령로 설정할 수가 있습니다. 디폴트의 정밀도치는 0 입니다. 이것은, 덧셈으로 뺄셈을 제외한 모든 산술은 정수치의 결과를 내는 것을 의미하고 있습니다.

스택의 제어

c   스택을 소거해, 비웁니다.

d   스택 선두의 값을 복제해, 스택에 쌓습니다. 따라서,``4d*p'' 는 4 의 자승을 계산해, 표시합니다.

r   스택 선두의 값과 2 번째의 값의 차례를 바꿔 넣습니다. (교환합니다. )

레지스터

dc (은)는, 적어도 256 개의 메모리레지스타를 가지고 있습니다. 각 레지스터는,1 캐릭터의 이름을 가지고 있습니다. 숫자나 캐릭터 라인을 레지스터에 보존해, 다음에 꺼낼 수가 있습니다.

sr  스택의 선두로부터 값을 꺼내, 레지스터 r 에 보존합니다.

lr  레지스터 r 의 값을 복제해, 그것을 스택에 쌓습니다. 이것은, r 의 내용을 변경하지 않습니다.

각 레지스터는, 그것 자신의 스택을 가지고 있습니다. 현재의 레지스터치는, 레지스터 스택의 선두입니다.

Sr  (메인) 스택의 선두의 값을 꺼내, 레지스터 r 의 스택에 그것을 쌓습니다. 레지스터의 이전의 값은, 액세스 할 수 없게 됩니다.

Lr  레지스터 r 의 스택의 선두의 값을 꺼내, 그것을 메인 스택에 쌓습니다. 레지스터 r 의 스택에 있던 이전의 값이 만약 있으면, lr 명령을 사용해 액세스 가능해집니다.

파라미터

dc (은)는, 그 조작을 제어하기 위한 3 개의 파라미터를 가지고 있습니다: 정밀도와 입력의 기수, 출력의 기수입니다. 정밀도는, 대부분의 산술 조작의 결과로 보존되는 소수의 자리수를 지정합니다. 입력의 기수는, 입력된 숫자의 해석을 제어합니다. 입력된 모든 숫자는 이 기수를 사용하고 있다고 여겨집니다. 출력의 기수는, 표시하는 숫자로 사용됩니다.

입력과 출력의 기수는, 분리된 파라미터입니다. 동일하게 설정하지 않아도 괜찮습니다만, 이것은 편리하기도 하고 혼동하기 쉽거나 합니다. 입력의 기수는 2 으로부터 16 의 범위가 아니면 안됩니다. 출력의 기수는 최저 2 가 아니면 안됩니다. 정밀도는 0 이상이 아니면 안됩니다. 정밀도는, 현재의 입력 기수나 출력 기수에 관계없이, 언제나 10 진의 자리수로 결정됩니다.

i   스택의 선두로부터 값을 꺼내, 입력 기수를 설정하기 위해서 사용합니다.

o   스택의 선두로부터 값을 꺼내, 출력 기수를 설정하기 위해서 사용합니다.

k   스택의 선두로부터 값을 꺼내, 정밀도를 설정하기 위해서 사용합니다.

I   현재의 입력 기수를 스택에 쌓습니다.

O   현재의 출력 기수를 스택에 쌓습니다.

K   현재의 정밀도를 스택에 쌓습니다.

캐릭터 라인

dc (은)는, 수와 같이 캐릭터 라인을 조작할 수 있습니다. 캐릭터 라인에 대해서 할 수 있는 유일한 일은, 그것을 표시해, 매크로로서 실행하는 것입니다. 매크로란,dc 명령로서 실행되는 캐릭터 라인의 내용입니다. 모든 레지스터와 스택은 캐릭터 라인을 보존할 수 있습니다. 그리고,dc 는 언제나, 주어진 데이터가 캐릭터 라인인가 숫자인지를 알고 있습니다. 산술 조작과 같은 몇개의 명령은, 수를 필요로 하고 있어 캐릭터 라인이 주어졌을 경우는 에러가 표시됩니다. 다른 명령은, 숫자나 캐릭터 라인을 받아들일 수가 있습니다. 예를 들면, p 명령은, 양쪽 모두를 받아들일 수가 있어 데이터를 그 형태에 응해 표시합니다.

[characters]
    (좌우의 균형을 취할 수 있던, [ (와)과 ] 그리고 둘러싸였다 ) characters 그렇다고 하는 캐릭터 라인을 만들어, 그것을 스택에 쌓습니다. 예를 들면, [foo]P (은)는 캐릭터 라인 foo (을)를 표시합니다 (가, 개행 캐릭터는 표시하지 않습니다).

a   스택 선두의 값을 꺼내, 그것이 숫자라면, 그 저위 바이트를 캐릭터 라인으로 변환해, 스택에 쌓습니다. 캐릭터 라인이라면, 그 최초의 캐릭터가 스택에 쌓아 되돌려집니다.

x   스택으로부터 값을 꺼내, 매크로로서 실행합니다. 보통, 이것은 캐릭터 라인입니다. 수의 경우는, 단순하게 그 값이 스택에 쌓아 되돌려집니다. 예를 들면, [1p]x (은)는, 매크로 1p (을)를 실행합니다. 1p (은)는, 1 (을)를 스택에 쌓아, 다른 행에 1 (을)를 표시합니다.

매크로는, 자주 레지스터에도 보존됩니다. [1p]sa (은)는, 1 (을)를 표시하기 위한 매크로를 레지스터 a 에 보존합니다. lax 그리고 이 매크로는 실행할 수 있습니다.

>r  스택으로부터 2 개의 값을 꺼내, 그것들을 수로 가정해 비교해, 원래의 스택의 선두가 큰 경우, 레지스터 r 의 내용을 실행합니다. 따라서, 1 2>a (은)는, 레지스터 a 의 내용을 실행합니다만, 2 1>a 그럼 실행하지 않습니다.

!>r 닮습니다만, 원래의 스택의 선두가 2 번째의 값보다 크지 않은 경우 (2 번째의 값이하인 경우), 매크로를 기동합니다.

<r  닮습니다만, 원래의 스택의 선두가 작은 경우에 매크로를 실행합니다.

!<r 닮습니다만, 원래의 스택의 선두가 2 번째의 값보다 작지 않은 경우 (2 번째의 값이상인 경우), 매크로를 기동합니다.

=r  닮습니다만, 2 개(살)이 꺼내진 값이 동일한 경우에 매크로가 실행됩니다.

!=r 닮습니다만, 2 개(살)이 꺼내진 값이 동일하지 않은 경우에 매크로가 실행됩니다.

?   단말로부터 행을 읽어들여, 실행합니다. 이 명령은, 유저로부터의 입력을 요구하기 위한 매크로로 사용할 수 있습니다.

q   매크로를 종료해, 그것을 호출한 매크로로부터도 종료합니다. 맨 위의 레벨인가, 맨 위의 레벨로부터 직접 불린 매크로로부터 불리면(자), q 명령은 dc 를 종료합니다.

Q   스택으로부터 값을 꺼내, 그것을 종료해야 할 매크로 레벨 수라고 해, 그 수의 매크로를 종료합니다. 따라서, 3Q (은)는, 3 개의 레벨을 종료합니다. Q 명령에서는,dc 를 종료할 것은 없습니다.

상태의 문의

Z   스택으로부터 값을 꺼내, 그 자리수 (캐릭터 라인의 경우는, 캐릭터수)를 계산해, 그 값을 스택에 쌓습니다.

X   스택으로부터 값을 꺼내, 그 소수점 이하의 자리수를 계산해, 그 값을 스택에 쌓습니다. 캐릭터 라인의 경우, 스택에는 0 하지만 쌓아집니다.

z   현재의 스택의 깊이를, 스택에 쌓습니다. 스택의 깊이란, z 명령이 실행되기 전의 스택의 데이터수입니다.

그 외의 다양한 일

!   행의 말미까지를 시스템 명령로서 실행합니다 (쉘 이스케이프). 명령 ! <, ! =, ! > 의 파스가 우선하기 때문에,<, =, > 그리고 개시한다 명령을 기동하고 싶은 경우에는,! 의 후에 공백을 더할 필요가 있습니다.

#   행의 말미까지를 코멘트로서 취급합니다.

:r  스택으로부터 2 개의 값을 꺼냅니다. 스택의 선두였던 값으로 배열 r (을)를 인덱스 해, 스택의 선두로부터 2 번째였던 값을 거기에 보존합니다.

;r  스택으로부터 값을 꺼내, 배열 r 의 인덱스로서 이용합니다. 배열로부터 선택된 값은, 그 후로 스택에 쌓아집니다.

버그

버그 보고는, bug-dc@gnu.org 에 전자 메일로 부탁합니다. 단어 ``dc''를 ``Subject:''필드의 어디엔가 넣어 두어 주세요.