DC

Section: User Commands (1)
Updated: 2025-01-05
Index JM Home Page roff page
 

名称

dc - 任意精度の計算機  

書式

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

説明

dc は、逆ポーランド形式の無限精度の計算が行える卓上計算機です。 この電卓は、定義やマクロ呼び出しも行えます。 普通、dc は標準入力から読み込みます。 コマンドライン引数が与えられた時は、それはファイル名となり、 dc はそのファイルを読み込み、ファイルの内容を実行した後で、 標準入力から入力を取ります。 通常の出力はすべて標準出力へ、エラー出力はすべて標準エラー出力へ 送られます。

逆ポーランド記法計算機は、数字をスタックに保存します。 数字を入力すると、それをスタックに積み上げます。 計算操作は、引数をスタックから取り出し、結果をスタックに積み上げます。

数字を dc に入力するためには、 0 から 9A から F までの、0 から 15 を表す値を使い (現在の RADIX に関係なく)、さらにオプションで単一の基数を含められます。 指数表現はサポートされていません。 負の数字を入力するためには、``_'' で始まる数字を入力します。 ``-'' は減算の二項演算子として使われているので、 このために利用することはできません。 引き続いて 2 つの数字を入力するためには、あいだに空白文字か改行文字を 入力します。 これらは、コマンドとしての意味はありません。  

オプション

dc は、次のコマンドラインオプション付きで起動可能です:
-V
--version
実行される dc のバージョンと著作権情報を表示し、終了します。
-h
--help
これらのコマンドラインオプションを短くまとめたメッセージと バグ報告アドレスを表示し、終了します。
-e script
--expression=script
script 中のコマンドを、入力処理中に実行するコマンド集合に追加します。
-f script-file
--file=script-file
ファイル script-file 中のコマンドを、入力処理中に実行するコマンド集合に追加します。
--max-recursion=depth
再帰する場合の、最も 深い 値を指定します。(主にデバッグ用に便利です。)

上記オプションの処理後にコマンドラインパラメータが残った場合、 これらのコマンドラインパラメータは処理対象の入力ファイル名として 解釈されます。 ファイル名 - は、標準入力ストリームを指します。 スクリプトファイル名または式を指定しないと、標準入力が処理されます。  

表示コマンド

p
スタックを変更することなく、スタックの先頭の値を表示します。 改行文字が、値の後に表示されます。
n
スタックの先頭の値を表示し、スタックから取り出します。 改行文字は、後に表示されません。
P
スタックの先頭の値をスタックから取り出します。 値が文字列の場合、末尾の改行を付けずに、単に表示します。 そうでない場合、これは数値であり、数値の絶対値の整数部分が、 "基数 (UCHAR_MAX+1)" のバイトストリームとして表示されます。 ここで (UCHAR_MAX+1) は 256 を仮定すると (ほとんどのマシンでは 8 ビットバイトなので)、文字列 KSK0k1/_1Ss [ls*]Sxd0>x [256~Ssd0<x]dsxxsx[q]Sq[Lsd0>qaPlxx] dsxxsx0sqLqsxLxLK+k もまたこの機能を実現します。 (上記のネイティブDCコードの複雑さの多くは、~ が文字を逆方向に 計算することと、すべてのレジスタが元の状態に戻ることを保証 したいという願望によるものです。)
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 番目の値の順番を入れ換え(交換)ます。 (これは、シーケンスSaSbLaLbを使用しても実現できます。)
R
スタックの先頭を整数値 n として取り出します。 更新されたスタック上で先頭から n 個を繰り返しローテートします。 もし n が正の数ならば、回転方向によって、最上位の要素は上から2番目の要素になります。 もし n が負の数ならば、回転によって、最上位の要素は上から n 番目の要素になります。 もし、スタックの深さが n より小さければ、エラーなしにスタック全部が回転され(適切な方向で)ます。
 

レジスタ

dc は、少なくとも 256 個のメモリレジスタを持っています。 各レジスタは、1 文字の名前を持っています。 数字や文字列をレジスタに保存し、後で取り出すことができます。

sr
スタックの先頭から値を取り出し、レジスタ r に保存します。
lr
レジスタ r の値を複製し、それをスタックに積みます。 レジスタが初期化されていない場合は値 0 が得られます。 これは、 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
スタック先頭の値を取り出し、それが数字なら、その低位バイトを 文字列に変換し、スタックに積みます。文字列なら、その最初の文字が スタックに積み戻されます。
注意: このコマンドは非推奨です;
詳細については dc. info を参照してください。 もし a コマンドを使い、それが GNU bc の一部として残っているのであれば、 保存を求めるバグレポートを提出してください。
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 のインデックスとして利用します。 配列から選ばれた値は、その後でスタックに積まれます。

レジスタの各スタックインスタンスは、その単純なスカラー値 (数値または文字列)と同じ名前の配列の両方で構成されることに 注意してください。したがって、1 0:x 0Sx 2 0:x Lx 0;xp1を出力します。これは、2が配列x のインスタンスの インデックス 0 に格納され、後でポップされ、インデックス 0 に 1 を 保持している x のインスタンスを再表示するためです。  

環境変数

DC_LINE_LENGTH
数値の出力を分割する列を指定します。デフォルト値は70です。 「0」に設定すると、行分割は無効になり、各出力行は数値を表すのに 必要な長さになります。
DC_PROMPT
標準入力上で対話的な入力を、dc が使用する場合の、 プロンプトを設定します。
 

バグ

バグ報告は、 bug-dc@gnu.org に電子メールでお願いします。  

参照

より詳細なドキュメントは、(ローカルなインストール状況に依存しますが) ``info dc'' で起動することで表示される dc.info 中にあります。


 

Index

名称
書式
説明
オプション
表示コマンド
計算
スタックの制御
レジスタ
パラメータ
文字列
状態の問い合わせ
その他のさまざまなこと
環境変数
バグ
参照

This document was created by man2html, using the manual pages.