説明
dc は任意精度の算術パッケージです。 通常は 10 進整数で演算しますが、
入力基数、出力基数、確保する小数点以下の桁数も指定することができます。
( bc(1) を参照。 bc は、任意表記法および関数をインプリメントする C 言語に似た構文を与える dc のプリプロセッサです。 bc も適当な制御構造をプログラムに与えます。) dc の構造全体はスタッキング (逆ポーランド式) 電卓です。
引き数を与えると、入力はそのファイルが終わるまでそのファイルから読みとられ、次に標準入力からとられます。
標準入力のファイルの終端、または q コマンドで dc は停止します。
以下の構文が認識されます。
| number | | 数の値はスタックにプッシュされます。 数は、数字 0-9 または A-F の連続した文字列です。
アンダースコア (_) を前に付けると、負の数を入力することができます。
数には、小数点を入れることができます。 |
| + - / * % ^ | | スタックのトップにある 2 つの値の加算 (+),
減算 (-), 乗算 (*), 除算 (/),
剰余 (%), または指数計算 (^)
を行います。この 2 つの値がスタックからポップされ、 その結果がスタック上の代りの位置にプッシュされます。
指数の小数部は無視され、警告メッセージが表示されます。 剰余は現在のスケールファクタに従って計算します。
これは整数剰余関数ではありません。 7 / 3 は 2.3 で、剰余 0.1 となるため、スケールが 1 ならば、 7 % 3 は 0.1(10 分の 1) になります。 |
| sx | | スタックのトップがポップされ、 x という名前のレジスタにストアされます。 ただし、 x は任意の文字とすることができます。 s を大文字にすると、 x はスタックとして処理され、その値がプッシュされます。 |
| lx | | レジスタ x における値がスタックにプッシュされます。 レジスタ x は変更されません。 レジスタはすべて初期値はゼロ値です。 l を大文字にすると、レジスタ x はスタックとして処理され、トップにある値がメインスタックにポップされます。 |
| d | | スタック上のトップにある値が複写されます。 |
| p | | スタック上のトップにある値がプリントされます。 そのトップにある値はそのままで変化しません。 P はスタックのトップを
ASCII 文字列として解釈し、その削除およびプリントを行います。 |
| f | | スタック上の値がすべてプリントされます。 |
| q | | プログラムを終了します。 文字列を実行する場合、再帰レベルは 2 だけポップされます。 q を大文字にすると、スタックのトップにある値がポップされ、
文字列実行レベルはその値だけポップされます。 |
| x | | スタックのトップにある要素を文字列として処理し、 dc コマンドの文字列としてそれを実行します。 |
| X | | スタックのトップにあるある数値をそのスケールファクタで置き換えます。 |
| [...] | | かっこで囲まれた ASCII 文字列をスタックのトップに書き込みます。 文字列は、ネストしたペアのかっこを使ってネストすることができます。 |
| <x >x =x | | |
| !<x !>x !=x | | スタックのトップにある 2 つの要素がポップされ比較されます。
それらが指定した関係にあれば、レジスタ x は評価されます。 |
| v | | スタック上のトップにある要素をその平方根で置き換えます。
引き数に小数部があると、それは考慮されますが、それ以外では、スケールファクタは無視されます。 |
| ! | | 行の残りを HP-UX システムコマンドとして解釈します (次の文字が <, >,
または = でない場合に限ります。 この場合には、上記の該当する関係演算子が使用されます)。 |
| c | | スタック上の値がすべてポップされます。 |
| i | | スタックのトップにある値がポップされ、以降の入力の数値基数として使用されます。 |
| I | | 入力基数をスタックのトップにプッシュします。 |
| o | | スタックのトップにある値がポップされ、以降の出力の数値基数として使用されます。
出力基数については、下記の注釈を参照してください。 |
| O | | 出力基数をスタックの最上部にプッシュします。 |
| k | | スタックの最上部がポップされ、 その値が負でないスケールファクタとして使用されます。
つまり、該当する桁数が出力にプリントされ、 乗算、除算、および指数計算時には該当する桁数が保持されます。
スケールファクタ、入力基数、および出力基数の相互作用は、 すべてがともに変更される場合に適当になります。 |
| K | | スケールファクタをスタックのトップにプッシュします。 |
| z | | スタックレベルがスタックにプッシュされます。 |
| Z | | スタックのトップにある数値をその長さで置き換えます。 |
| ? | | 入力ソース (通常ターミナル) から 1 行とられ、実行されます。 |
| ;と: | | bc によって配列演算のために使用されます。 |
| Y | | dc 自体のデバッギング出力を生成します。 |
入力基数はどんな数値でもかまいませんが、 数字 0〜9 と A〜F のみが入力に利用できます。
したがって、基数は範囲 1〜16 までに制限されます。 16 個すべての可能な数字を任意の基数で使用でき、
つねに通常の値をとります。
出力基数はどんな数値でもかまいません。 2〜16 の範囲の基数では、「通常の」結果が得られます。
英字 A〜F は 10〜16 の値を表します。 基数 0 および 1 では、その長さがその数の値である 1 の文字列を生成します。
基数-1 は、 d で構成される同様の文字列を生成します。
その他の基数では、それぞれの「数字」は その数字の序数を与える (複数桁の)10 進数として表されます。
それぞれの「数字」は負の基数の場合には符号が付けられます。 「数字」はスペースで区切られます。
出力基数の定義を与えると、コマンド Op はつねに (その基数に適した表現で)"10"になります。 O1-p は出力基数に関する有効な情報を与えます。
診断
| x is unimplemented |
| | | ただし、 x は 8 進数です。 |
| stack empty | | 要求された操作を行うには、スタック上にある要素の数が不十分です。 |
| Out of space | | 未使用リストが使い果たされています (桁数が多すぎます)。 |
| Out of headers | | 記憶している数値が多すぎます。 |
| Out of pushdown | | スタック上にある項目の数が多すぎます。 |
| Nesting Depth | | ネスト実行のレベルの数が多すぎます。 |
例
この例は n!(n の階乗) の最初の 10 個の値をプリントします。
[la1+dsa*pla10>y]sy
0sa1
lyx
参照
bc(1)
『Number Processing Users Guide』の 「DC: An Interactive Desk
Calculator チュートリアル」