EN JA
DC(1)
DC(1) FreeBSD General Commands Manual DC(1)

名称

dc卓上計算機

書式

dc [ -hxV][ -e expression][ -f filename][ filename]

解説

dc は、任意精度の演算パッケージです。 dc の全体構造は、スタック (逆ポーランド) 計算機です、すなわち、数値は、スタックに格納されます。数を追加すると、それはスタックにプッシュされます。算術演算は、スタックから引数をポップアップし、結果をプッシュします。また、中置記法 (infix notation) とプログラムのための関数と適度な制御構造を実装している、C 風の構文を提供している、 dc のためのプリプロセッサである bc(1) ユーティリティを参照してください。オプションは、次の通りです:
-e expr, - -expression expr
expression (式) を評価します。複数の -e オプションが指定されるなら、それらは、与えられた順序で処理されます。 filename 引数が与えられないなら、コマンドラインで与えられた式を処理した後に、実行は、停止します、そうでなければ、 filename の内容を継続して処理します。
-f filename, - -file filename
更なる計算が完了する前に、与えられたファイルの内容を処理します。複数の -f オプションが指定されるなら、それらは、与えられた順序で処理されます。
-h, - -help
短い使用法の情報を印刷 (表示) します。
-V, - -version
バージョン情報を印刷 (表示) します。
-x
拡張登録モードを有効にします。このモードは、256 以上のレジスタを許容する bc(1) によって使用されます。より詳細な説明については、 登録 を参照してください。

通常、 dc は、10 進整数で動作しますが、入力ベース、出力ベースと維持される多くの小数の桁 (スケール) を指定できます。引数が与えられるなら、入力は、そのファイルの終わりまでの取られ、次に標準入力から取られます。空白類は、数の終わり、行の終り、またはレジスタ名が予想されるとき、そのシグナルが起こるところを除いて、無視されます。次の構造が、認識されます:

number
数の値は、スタックにプッシュされます。数は、数値 0-9 と文字 A-F の連続した文字列です。負の数を入力するために、下線 (‘_’) によって先導されます。数は、単一の小数点を含むことができます。また、数は、値 10-15 がある、文字 A-F を含むことができます。
+ - / * % ~ ^
スタックの最上部 2 つの値は、追加され (+)、引き算され (-)、掛け算され (*)、割算され (/)、剰余され (%)、割算と剰余され (~) るか、またはべき乗 (^) されます。 2 つのエントリがスタックから取り出されます。結果は、それらの場所でスタックにプッシュされます。指数の小数部分は、無視されます。

足し算と引き算に関して、結果のスケールは、オペランドのスケールの最大値です。割算に関しては、結果のスケールは、 k 演算でスケールセットによって定義されます。掛け算に関して、スケールは、式 min(a+b,max(a,b,scale)) によって定義されます、ここで ab は、オペランドのスケールであり、 scale は、 k 演算によって定義されたスケールです。負でない指数があるべき乗に関して、結果のスケールは、 min(a*b,max(scale,a)) です、ここで a は、スケールのベースで、 b は、指数の value です。指数が負であるなら、結果のスケールは、 k 演算によって定義されたスケールです。

割算とモジュロ演算子 (~) の場合では、結果の商は、剰余が続いて最初にプッシュされます。これは、シーケンスの省略表現です:

x y / x y %

割算とモジュロ演算子は、移植性のない拡張です。

a
スタックから最上位の値をポップアウトします。その値が数値であるなら、数値のモジュロ 256 の整数部を計算します。結果が 0 であるなら、空の文字列をプッシュします。そうでなければ、 ASCII 文字として計算された値を解釈することによって、1 つの文字列をプッシュします。

最上位の値が文字列であるなら、元の文字列の最初の文字を含む文字列をプッシュします。元の文字列が空であるなら、空の文字列がプッシュバックされます。 a 演算子は、移植性のない拡張です。

c
スタックのすべての値が、ポップアップされます。
d
スタックの最上位の値は、重複されます。
f
改行によって区切られ、スタックのすべての値が印刷されます。
G
最上位の 2 つの数値がスタックからポップアップされ、比較されます。スタックの最上位がスタックの 2 番目の数と等しいなら、それは、プッシュされます。そうでなければ、0 がプッシュされます。これは、移植性のない拡張す。
I
スタックの最上位で入力ベースをプッシュします。
i
スタックの最上位の値は、更なる入力のためのベースとしてポップアップされて、使用されます。最初の入力ベースは、10 です。
J
スタックから最上位の値をポップアップします。再帰レベルは、その値によってポップアップされ、それに続いて、入力は、 M 演算子の最初の出現までスキップされます。 J 演算子は、 bc(1) コマンドで使用される、移植性のない拡張です。
K
現在のスケールファクタが、スタックにプッシュされます。
k
スタックの最上位は、ポップアップされ、その値は、負でないスケールファクタとして使用されます: 適切なけた数は、出力に印刷され、掛け算、割り算、べき乗の間に維持されます。スケールファクタ、入力ベースと出力ベース相互作用は、すべてが一緒に変更されるなら、妥当となります。
L x
レジスタ x は、スタックとして扱われ、最上位の値は、メインスタックでポップアップされます。
l x
レジスタ x の値は、スタックにプッシュされます。レジスタ x は、変更されません。最初に、すべてのレジスタは、値 0 を含んでします。
M
J 演算子によって使用されマークされます。 M 演算子は、 bc(1) コマンドで使用される、移植性のない拡張です。
N
スタックの最上位が、0 に等しいなら、スタックの最上位は、1 で置き換えられます。スタックの最上位が 0 と等しくないなら、それは、0 に置き換えられます。これは、移植性のない拡張す。
n
スタックの最上位の値は、ポップアップされ、改行なしで印刷されます。これは、移植性のない拡張す。
O
スタックの最上位で出力ベースをプッシュします。
o
スタックの最上位の値は、ポップアップされ、後の出力のためのベースとして使用されます。最初の出力ベースは、10 です。
P
スタックの最上位がポップアップされます。スタックの最上位が文字列であるなら、それは、後続する改行なしで印刷されます。スタックの最上位が数値であるなら、それは、ベース 256 の数値として解釈され、このベース 256 数値の各桁は、後続する改行なしで、 ASCII 文字として印刷されます。
p
スタックの最上位の値は、後続する改行をつけて印刷されます。最上位の値は、変更されないままとなります。
Q
スタックの最上位の値は、ポップアップされ、文字列の実行レベルは、その値によってポップアップされます。
q
プログラムは、終了します。文字列を実行するなら、再帰レベルは、2 つポップアップされます。
R
スタックの最上位は、削除されます (ポップアップされます)。これは、移植性のない拡張す。
r
スタックの最上位 2 つの値は、逆にされます (交換されます)。これは、移植性のない拡張す。
S x
レジスタ x は、スタックとして扱われます。メインスタックの最上位の値は、ポップアップされ、それをプッシュします。
s x
スタックの最上位は、ポップアップされ、 x という名前のレジスタに、格納されます。
v
スタックの最上位の要素を平方根によって置き換えます。結果のスケールは、引数のスケールとスケールの現在値の最大です。
X
スタックの最上位の数値をスケールファクタに置き換えます。スタックの最上位が文字列であるなら、それを整数 0 に置き換えます。
x
スタックの最上位の要素を文字列として扱い、 dc コマンドの文字列として実行します。
Z
スタックの最上位の数値を長さに置き換えます。文字列の長さは、その文字の数値です。数値の長さは、マイナス記号と小数点を数えるのではなく、そのけた数です。
z
スタックレベルは、スタックにプッシュされます。
[... ]
括弧が付けられた ASCII 文字列をスタックの最上位に置きます。文字列が括弧を含んでいるなら、これらは、適切にバランスがとられなければなりません。バックスラッシュ文字 (‘\’) は、エスケープ文字として使用され、文字列のバランスのとれない括弧を含むことを可能にします。文字列にバックスラッシュを含むためには、2 つのバックスラッシュを使用します。
< x > x = x !< x !> x != x
スタックの最上位 2 つの要素は、ポップアップして、比較されます。レジスタ x は、それらが定められた関係に従うなら、実行されます。
< xe y > xe y = xe y !< xe y !> xe y != xe y
これらの演算は、上記の比較演算の変異型です。最初のレジスタ名は、文字‘e’と別のレジスタ名が続きます。レジスタ x は、関係が真であるなら、実行され、レジスタ y は、関係が偽であるなら、実行されます。これは、移植性のない拡張す。
(
最上位の 2 つの数値は、スタックからポップアップして、比較されます。スタックの最上位がスタックの 2 番目の数値以下であるなら、1 が、プッシュされます。そうでなれれば、0 がプッシュされます。これは、移植性のない拡張す。
{
最上位の 2 つの数値は、スタックからポップアップされ、比較されます。スタックの最上位がスタックの 2 番目の数値以下であるなら、1 がプッシュされます。そうでなければ、0 がプッシュされます。これは、移植性のない拡張す。
!
UNIX コマンドとして行の残りを解釈します。
?
入力行は、入力ソース (通常端末) から取られて、実行されます。
: r
スタックから 2 つの値をポップアップします。スタックの 2 番目の値は、スタックの最上位によってインデックス付けられた配列 r として格納されます。
; r
スタックから値をポップアップします。値は、レジスタ r にインデックスとして使用されます。このレジスタの値は、スタックにプッシュされます。

最初に配列の要素は、値 0 となっています。スタックされたレジスタの各レベルには、それに関連しているそれ自体の配列があります。コマンドシーケンス

[first] 0:a [dummy] Sa [second] 0:a 0;a p La 0;a p

は、次のように印刷され、

second 
first

続いて、文字列‘ second’は、‘ first’が格納された配列をあらわにするために、後でポップアップされる配列に書き込まれます。

#
行の残りをスキップします。これは、移植性のない拡張す。

レジスタ

レジスタには、単一の文字名 x があります、ここで x は、空白、タブまたは他の特殊文字も含んで、任意の文字を指定できます。拡張レジスタモードが、 -x オプションを使用して有効にされ、レジスタ識別子 x に値 255 があるなら、次の 2 つの文字は、2 バイトのレジスタインデックスとして解釈されます。標準の単一文字のレジスタの組と拡張レジスタの組は、オーバラップしません。拡張レジスタモードは、移植性のない拡張です。

使用例

次は、 n! の最初の 10 個の値を印刷する例です:

[la1+dsa*pla10>y]sy 
0sa1 
lyx

現在の入力ベースと無関係に、次のコマンド

Ai

は、入力ベースを 10 進数の 10 にリセットします。

診断

%c (0%o) is unimplemented
未定義の演算が呼び出されました。
stack empty
何か問い合わせを行うとき、スタックに十分な要素がない。
stack register '%c' (0%o) is empty
スタックレジスタからの L 演算において、それは、空です。
Runtime warning: non-zero scale in exponent
指数の端数部分において、それは、無視されています。
divide by zero
試みにおいて、0 除算しました。
remainder by zero
試みにおいて、残り 0 を取りました。
square root of negative number
試みにおいて、符の数値の平方根を取りました。
index too big
配列インデックスにおいて、それは、2048 より大きいです。
negative index
符の配列インデックスとなりました。
input base must be a number between 2 and 16
試みにおいて、不正な入力ベースが設定されている。
output base must be a number greater than 1
試みにおいて、不正な出力ベースが設定されている。
scale must be a nonnegative number
試みにおいて、負または 0 のスケールが設定されている。
scale too large
試みにおいて、あまりに大きなスケールが設定されている。スケールは、32 ビットの符号なしの数値として表現可能でなければなりません。
Q command argument exceeded string execution depth
試みにおいて、現在の再帰レベルより大きな再帰レベルがポップアップされた。
Q command requires a number >= 1
試みにおいて、不正な数の再帰レベルがポップアップされた。
recursion too deep
ネストされた実行のレベルが多すぎます。

x または ? 演算またはレジスタの実行で比較演算の結果の一つが実行されたなら、再帰レベルは、1 つ増加されます。例外として、演算が文字列の最後のコマンドとして実行されるなら、再帰レベルは、増加されません。例えば、コマンド

[lax]sa 
1 lax

は、永久ループを実行し、一方、次のコマンド

[laxp]sa 
1 lax

は、再帰レベルが深過ぎるので、終了します。

J command argument exceeded string execution depth
試みにおいて、現在の再帰レベルより大きい再帰レベルがポップアップされました。
mark not found
M 演算子の発生のためにスキャンが失敗しました。

関連項目

bc(1)

L. L. Cherry, R. Morris "DC - An Interactive Desk Calculator" /usr/share/doc/usd/05.dc/.

規格

dc ユーティリティの算術演算は、 IEEE Std 1003.2 (“POSIX.2”) 仕様の bc(1) セクションにリストされた定義に適合するはずです。

歴史

dc コマンドは、 Version 6 AT&T UNIX ではじめて登場しました。 bn(3) 大きい数のルーチンを使用する dc コマンドの完全な書き直しは、 OpenBSD 3.5 ではじめて登場しました。

作者

dc コマンドのオリジナルバージョンは、 Robert MorrisLorinda Cherry によって書かれました。 dc ユーティリティの現在の版は、 Otto Moerbeek によって書かれました。
January 22, 2010 FreeBSD