bc コマンド

目的

任意精度の算術計算言語のインタープリターを提供します。

構文

bc-c ] [  -l ] [ File ... ]

説明

bc コマンドは、任意精度の算術計算を提供する対話式処理です。bc コマンドは、まず File パラメーターで指定された入力ファイルを読み取ってから、標準入力を読み取ります。 入力ファイルは、bc コマンドで読み取りかつ実行できるコマンド、ステートメント、または関数定義のシーケンスが入ったテキスト・ファイルでなければなりません。

bc コマンドは、 dc コマンドのプリプロセッサーです。 (コンパイルのみ) -c フラグを指定しなければ、 自動的に dc コマンドが呼び出されます。 -c フラグを指定すると、bc コマンドからの出力は標準出力に送られます。

bc コマンドを使用すると、演算の入出力基数を 10 進、8 進、または 16 進で指定できます。デフォルトは 10 進です。また、このコマンドは 10 進小数点表記のスケーリングを提供します。bc コマンドは、現在のロケールの一部として指定された小数点文字に関係なく、常に . (ピリオド) で小数点を表します。

bc コマンドの構文は、C 言語の構文に似ています。bc コマンドを使うと、ibase キーワードを入力基数に割り当て、obase キーワードを出力基数に割り当てることによって、基数どうしを変換できます。ibase キーワードの値には、2 から 16 の範囲が有効です。obase キーワードの範囲は、2 から、BC_BASE_MAX 値で設定された上限までです。BC_BASE_MAX 値は、/usr/include/sys/limits.h ファイルで定義されます。ibaseobase の設定値に関係なく、bc コマンドは A から F までの文字を 16 進値の 10 から 15 として認識します。

bc コマンドの出力は、読み取られるプログラムによって制御されます。 出力は、割り当てを除くすべての実行式の値が入っている 1 行または複数行からなっています。出力の基数と精度は、obase および scale キーワードの値によって制御されます。

bc コマンドがソース・ファイルの情報をどのように処理するかについては、以下のセクションに記載されています。

文法

次に示す文法は、bc プログラムの構文を記述したものです。program は任意の有効なプログラムを表します。


%token  EOF NEWLINE STRING LETTER NUMBER
 
%token  MUL_OP
/*      '*', '/', '%'                            */
 
%token  ASSIGN_OP
/*      '=', '+=', '-=', '*=', '/=', '%=', '^='  */
 
%token  REL_OP
/*      '==', '<=', '>=', '!=', '<', '>'          */
 
%token  INCR_DECR
/*      '++', '--'                                */
 
%token  Define    Break    Quit    Length
/*      'define', 'break', 'quit', 'length'       */
 
%token  Return    For    If    While    Sqrt
/*      'return', 'for', 'if', 'while', 'sqrt'    */
 
%token  Scale    Ibase    Obase    Auto
/*      'scale', 'ibase', 'obase', 'auto'         */
 
%start   program
 
%%
 
program           : EOF
                  | input_item program
                  ;
 
input_item        : semicolon_list NEWLINE
                  | function
                  ;
 
semicolon_list    : /* empty */
                  | statement
                  | semicolon_list ';' statement
                  | semicolon_list ';'
                  ;
 
statement_list    : /* empty */
                  | statement
                  | statement_list NEWLINE
                  | statement_list NEWLINE statement
                  | statement_list ';'
                  | statement_list ';' statement
                  ;
 
statement         : expression
                  | STRING
                  | Break
                  | Quit
                  | Return
                  | Return '(' return_expression ')'
                  | For '(' expression ';'
                        relational_expression ';'
                        expression ')' statement
                  | If '(' relational_expression ')' statement
                  | While '(' relational_expression ')' statement
                  | '{' statement_list '}'
                  ;
function          : Define LETTER '(' opt_parameter_list ')'
                        '{' NEWLINE opt_auto_define_list
                        statement_list '}'
                  ;
 
opt_parameter_list:/* empty */
                  | parameter_list
                  ;
 
parameter_list    : LETTER
                  | define_list ',' LETTER
                  ;
 
opt_auto_define_list
                  : /* empty */
                  | Auto define_list NEWLINE
                  | Auto define_list ';'
                  ;
 
define_list       : LETTER
                  | LETTER '[' ']'
                  | define_list ',' LETTER
                  | define_list ',' LETTER '[' ']'
                  ;
 
opt_argument_list : /* empty */
                  | argument_list
                  ;
 
argument_list     : expression
                  | argument_list ',' expression
                  ;
 
relational_expression
                  : expression
                  | expression REL_OP expression
                  ;
 
return_expression : /* empty */
                  | expression
                  ;
 
expression        : named_expression
                  | NUMBER
                  | '(' expression ')'
                  | LETTER '(' opt_argument_list ')'
                  | '-' expression
                  | expression '+' expression
                  | expression '-' expression
                  | expression MUL_OP expression
                  | expression '^' expression
                  | INCR_DECR named_expression
                  | named_expression INCR_DECR
                  | named_expression ASSIGN_OP expression
                  | Length '(' expression ')'
                  | Sqrt '(' expression ')'
                  | Scale '(' expression ')'
                  ;
 
named_expression  : LETTER
                  | LETTER '[' expression ']'
                  | Scale
                  | Ibase
                  | Obase
                  ;

字句規則

bc コマンドには、次の字句規則が適用されます。

  1. bc コマンドは、所定の地点から始まる可能な最長の字句トークンまたは区切り文字を認識します。
  2. コメントは /* (スラッシュ、アスタリスク) で始まり、 */ (アスタリスク、スラッシュ) で終わります。コメントには、字句トークンを区切る以外の効果はありません。
  3. 改行文字は NEWLINE トークンとして認識されます。
  4. STRING トークンは、文字列定数を表します。 文字列の前後は " (二重引用符) で囲まれています。引用符で囲まれたすべての文字は、字句ごとに取り出されます。" (二重引用符) を含む文字列を指定する方法はありません。 各文字列の長さは、BC_STRING_MAX の値で設定された最大バイト数に制限されます。この値は、limits.h ファイル内で定義されます。
  5. STRING トークンに含まれている場合、 または字句トークンを区切るために使われる場合を除き、 ブランク文字を使用しても効果はありません。
  6. ¥n (円記号、改行) 文字:
    • 字句トークンを区切ります。
    • STRING トークン内では文字シーケンスとして解釈されます。
    • 複数行にまたがる NUMBER トークンの一部として使うと、 無視されます。
  7. NUMBER トークンには、次の文法が使われます。
    NUMBER  : integer
            | '.' integer
            | integer '.'
            |integer '.' integer
            ;
    integer : digit
            | integer digit
            ;
    digit   : 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
            | 8 | 9 | A | B | C | D | E | F
            ;
    NUMBER トークンの値は、ibase 内部レジスター値で指定された基数の数値として解釈されます。
  8. NUMBER トークンの値は、ibase 内部レジスターの値で指定された基数の数値として解釈されます。 各数字は上記の順序で 0 から 15 までの値を持ち、ピリオド文字は小数点を表します。トークン内に ibase レジスターの値以上の数字があると、動作は不定になります。ただし、ibase および obase レジスターそのものに 1 桁の値を割り当てる場合は例外です。
  9. 次に示すキーワードは、トークンとして認識されます。
    auto    for     length   return sqrt
    break   ibase   obase    scale  while
    define  if      quit
  10. キーワード内を除き、 次に示す文字は LETTER トークンと見なされます。
    a b c d e f g h i j k l m n o p q r s t u v w x y z
  11. 次に示す 1 文字と 2 文字のシーケンスは、 ASSIGN_OP トークンとして認識されます。
    • = (等号)
    • += (正符号、等号)
    • -= (負符号、等号)
    • *= (アスタリスク、等号)
    • /= (スラッシュ、等号)
    • %= (パーセント、等号)
    • ^= (脱字記号、等号)
  12. 次に示す 1 文字は、MUL_OP トークンとして認識されます。
    • * (アスタリスク)
    • / (スラッシュ)
    • % (パーセント)
  13. 次に示す 1 文字と 2 文字のシーケンスは、 REL_OP トークンとして認識されます。
    • == (二重等号)
    • <= (より小、等号)
    • >= (より大、等号)
    • != (感嘆符、等号)
    • < (より小)
    • > (より大)
  14. 次に示す 2 文字のシーケンスは、 INCR_DECR トークンとして認識されます。
    • ++ (二重正符号)
    • -- (二重ハイフン)
  15. 次に示す 1 文字は、トークンとして認識されます。トークンには文字と同じ名前が付いています。
    <newline>
    ( (左括弧)
    ) (右括弧)
    , (コンマ)
    + (正符号)
    - (負符号)
    ; (セミコロン)
    [ (左大括弧)
    ] (右大括弧)
    ^ (脱字記号)
    { (左中括弧)
    } (右中括弧)
  16. 入力の終わりに達すると、 EOF トークンが戻されます。

ID と演算子

bc コマンドでは、通常の ID、アレイ ID、 およびファンクション ID という 3 種類の ID が認識されます。3 種類とも、単一の小文字からなっています。アレイ ID の後ろには [ ] (左右の大括弧) が付いています。 引数内または自動リスト内を除き、配列添え字が必要です。 アレイは 1 次元であり、BC_DIM_MAX の値で指定された量まで入れることができます。索引は 0 から始まります。したがって、アレイには 0 から BC_DIM_MAX -1 で定義された値までの索引が付けられます。添え字は整数に切り捨てられます。関数ファンクション ID の後ろには ( ) (左右の括弧) を付け、場合によっては前後に引数を付けなければなりません。3 種類の ID は競合しません。

次の表に示す bc プログラム内の演算子は、すべての演算子の優先順位と結合順序に関するルールをまとめたものです。同じ行の演算子は同じ優先順位を持っています。各行は降順になっています。

演算子 結合順序
++, -  - 適用できない
単項 - 適用できない
^ 右から左へ
*, /, % 左から右へ
+, 2 項 - 左から右へ
=, +=, -=, *=, /=, ^= 右から左へ
==, <=, >=, !=, <, > なし

個々の式または名前付き式にはスケール があります。スケールとは、式の小数部分として保持される 10 進数の 桁数のことです。

名前付き式 とは、値が格納される場所のことです。名前付き式は、代入式の左辺に有効です。名前付き式の値は、指定された場所に保管値です。単純な ID と配列エレメントは名前付き式なので、初期値は 0 で初期スケールは 0 です。

内部レジスター scaleibase、および obase は、いずれも名前付き式です。このいずれかのレジスター名からなる式のスケールは 0 です。これらのレジスターに割り当てられる値は、整数に切り捨てられます。scale レジスターには、式のスケールの計算に使用するグローバル値が入っています (以下の説明を参照してください)。scale レジスターの値は、0 <= scale <= {BC_SCALE_MAX} に制限されており、デフォルト値は 0 です。ibase および obase レジスターは、それぞれ入力数と出力数の基数です。ibase の値は、2 <= ibase <= 16 に制限されます。obase の値は、2 <= obase = {BC_BASE_MAX} に制限されます。

ibase または obase レジスターに、 字句規則のセクションで説明したリストの 1 桁の値を割り当てると、 その値は 16 進数と見なされます。例えば次のとおりです。


ibase=A 

この式は、ibase レジスターの現行値に関係なく、基数 10 に設定されます。それ以外の場合、ibase レジスターの値以上の数字が入力に含まれていると、動作が不定になります。 ibase および obase レジスターの初期値は、どちらも 10 です。

内部計算では、入出力の基数に関係なく、10 進であるものとして、指定された桁の 10 進数が得られます。以下のように、正確な結果が得られない場合があります。

scale=0; 3.2/1

この場合、bc コマンドは結果を切り捨てます。

obase レジスターの数値はすべて、次に示すルールに従って出力されます。

  1. 値が 0 より小さい場合は、- (ハイフン) が出力されます。
  2. 数値に応じて、次に示すいずれかの値が出力されます。
    • 数値の絶対値が 1 以上の場合、 obase レジスターに該当する一連の桁として、 値の整数部が出力されます (ステップ 3 を参照)。次に、最上位のゼロ以外の桁が出力され、それに続いて下位の桁が出力されます。
    • 数値の絶対値が 1 未満で 0 より大きく、 数値のスケールが 0 より大きい場合、 文字 0 が出力されるかどうかは不明です。
    • 数値が 0 の場合は、文字が出力されます。
  3. 値のスケールが 0 より大きい場合は、 . (ピリオド) に続いて次の obase レジスター値に対号する一連の桁が出力されます。 各桁は値の小数部の最上位部をあらわし、 s は出力される値のスケールを表します。
    • obase の値が 10 の場合は、s 桁が出力されます。
    • obase の値が 10 より大きい場合は、s 桁以下が出力されます。
    • obase の値が 10 より小さい場合は、s 桁以上が出力されます。
    • obase の値が 10 以外の場合は、これは 10s の精度を表すために必要な桁数でなければなりません。
    • obase の値が 2 から 16 までの場合は、有効な桁は次の 1 文字の最初の obase です。
      0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
      この場合、それぞれ値 0 から 15 までを表します。
    • 基数が 16 より大きい場合、 各桁は複数桁の個々の 10 進数として書き込まれます。 最上位小数桁を除き、各桁の前にはスペース文字が 1 個ずつ付いています。基数が 17 から 100 までの場合、bc コマンドは 2 桁の 10 進数を書き込み、基数が 101 から 1000 までの場合、bc コマンドは 3 桁の 10 進数を書き込みます。例えば、基数が 25 の 10 進数 1024 は、以下のように書き込まれます。
      
      01 15 24

      基数が 125 であれば、以下のように書き込まれます。

      008 024
    極端に大きい数値は、POSIX ロケール内では 1 行に 70 文字ずつ、複数行に分割されます。他のロケールでは、異なる文字境界で分割することができます。複数に継続する行の終わり には ¥ (円記号) を付けなければなりません。

数値定数は式です。スケールは、定数を表す入力内の小数点に続く桁数、または小数点が表示されない場合は 0 です。

シーケンス (expression) は、expression と同じ値とスケールを持つ式です。小括弧を使うと、通常の優先順位を変更できます。

単項演算子と 2 項演算子には、次のセマンティクスがあります。

項目 説明
-expression 結果は、式に負符号を付けた値です。結果のスケールは式のスケールです。

 

単項の増分演算子と減分演算子は、演算対象の名前付き式のスケールを変更しません。結果のスケールは、その名前付き式のスケールです。
++named_expression 名前付き式が 1 ずつ増分されます。結果は、増分後の名前付き式の値です。
- -named_expression 名前付き式が 1 ずつ減分されます。結果は、減分後の名前付き式の値です。
named_expression++ 名前付き式が 1 ずつ増分されます。結果は、増分前の名前付き式の値です。
named_expression- - 名前付き式が 1 ずつ減分されます。結果は、減分前の名前付き式の値です。

指数演算子 ^ (脱字記号) は、右から左にバインドします。

項目 説明
expression ^expression 結果は、第 1 の expression を第 2 の expression 乗じた値です。第 2 の式が整数でなければ、動作は不定になります。左辺の式のスケールを a、右辺の式の絶対値を b とすると、 計算結果のスケールは次のようになります。

if b >= 0 min(a * b, max(scale, a))
if b <     0 scale

乗算演算子 * (アスタリスク)、/ (スラッシュ)、および % (パーセント) は、左から右にバインドします。

項目 説明
expression * expression 結果は、2 つの式の積になります。2 つの式のスケールを a および b とすると、結果のスケールは次のようになります。
min(a+b,max(scale,a,b))
expression / expression 結果は、2 つの式の商になります。結果のスケールは scale の値です。
expression % expression ab の場合、a % b は、次に示す手順と同等のものとして計算されます。
  1. a/b を現行のスケールまで計算します。
  2. 1 の結果を使って、次のように計算します。
    
    a - (a / b) * b
    この場合、以下のスケールまで計算されます。
    
    max(scale + scale(b), scale(a))
    すると、結果のスケールは以下のようになります。
    max(scale + scale(b), scale(a))
scale が 0 の場合、% 演算子は数学剰余演算子です。

加算演算子 + (正符号) と - (負符号) は、左から右にバインドします。

項目 説明
expression + expression 結果は、2 つの式の和です。結果のスケールは、式のスケールの最大値です。
expression - expression 結果は、2 つの式の差です。結果のスケールは、式のスケールの最大値です。

次に示す代入演算子は、右から左にバインドします。

  • = (等号)
  • += (正符号、等号)
  • -= (負符号、等号)
  • *= (アスタリスク、等号)
  • /= (スラッシュ、等号)
  • %= (パーセント、等号)
  • ^= (脱字記号、等号)
項目 説明
named-expression = expression この式では、右辺の式の値が左辺の名前付き式に代入されます。名前付き式とその結果のスケールは、式のスケールになります。

複合代入フォーマット:

named-expression <operator >= expression

これは、次に示す式と同等です。

named-expression = named-expression <operator > expression

ただし、名前付き式は一度しか計算されません。

他のすべての演算子と違って、次に示す関係演算子は if または while ステートメントのオブジェクトとして、または for ステートメント内でのみ有効です。

  • < (より小)
  • > (より大)
  • <= (より小、等号)
  • >= (より大、等号)
  • == (二重等号)
  • != (感嘆符、等号)
項目 説明
expression1 < expression2 expression1 の値が厳密に expression2 の値より小さければ、この関係は真です。
expression1 > expression2 expression1 の値が厳密に expression2 の値より大きければ、この関係は真です。
expression1 <= expression2 expression1 の値が expression2 の値以下であれば、この関係は真です。
expression1 >= expression2 expression1 の値が expression2 の値以上であれば、この関係は真です。
expression1 == expression2 expression1 の値と expression2 の値が等しければ、この関係は真です。
expression1 != expression2 expression1 の値と expression2 の値が等しくなければ、この関係は真です。

ステートメント

ステートメントが式フォーマットの場合、メイン演算子が代入演算子でない限り、ステートメントを実行すると式の値に続いて改行文字が書き込まれます。

ステートメントが文字列の場合、ステートメントを実行すると文字列の値が書き込まれます。

セミコロンまたは改行文字で区切られたステートメントは、順次に実行されます。bc コマンドを対話式で呼び出すと、次に示す文法上の結果を満たす改行文字がそのつど読み取られます。

input_item : semicolon_list NEWLINE

semicolon_list を構成するステートメントの順次リストが即座に実行され、その実行結果として生成される出力はバッファー遅延なしに書き込まれます。

if ステートメント (if (relation) statement) の場合、関係が真であれば statement が実行されます。

while ステートメント (while (relation) statement) は、relation を検査するループを実行します。relation が真であるたびに statement が実行され、relation が再検査されます。relation が偽であれば、statement のあとから実行が再開されます。

for ステートメント (for (expression; relation; expression) statement) は、次に示すステートメントと同じです。

first-expression
while   (relation) {
   statement
   last-expression
}

3 つの式がすべて存在しなければなりません。

break ステートメントは、 for または while ステートメントを終了させます。

auto ステートメント (auto identifier [,identifier ] ...) は、ID の値をプッシュダウンします。ID として、通常の ID またはアレイ ID を使えます。アレイ ID を指定するには、後ろにアレイ名を空の大括弧で囲んで指定します。auto ステートメントは、関数定義内の最初のステートメントでなければなりません。

define ステートメント:


define   LETTER ( opt_parameter_list )  {
   opt_auto_define_list
   statement_list
}

上のステートメントは、LETTER という関数を定義しています。LETTER 関数が以前に定義されていると、define ステートメントは以前の定義を置換します。 式は次のとおりです。

LETTER ( opt_argument_list )

LETTER 関数を呼び出します。呼び出し時の引数の数が定義内のパラメーターの数と一致しなければ、動作は不定になります。 各関数は、呼び出される前に定義されます。関数はその本体内で定義済みと見なされるので、再帰呼び出しは有効です。関数内の数値定数の値は、その関数の呼び出し時に ibase レジスターの値で指定した基数で解釈されます。

return ステートメント (return および return(expression)) は、関数を終了させ、その auto 変数をポップして、関数の結果を指定します。第 1 の書式は return (0) と同等です。 関数の呼び出しの値とスケールは、小括弧内の式の値とスケールです。

quit ステートメント (quit) は、関数定義内、あるいは ifforwhile ステートメント内で使用した場合でも、入力内にこのステートメントが発生した時点で bc プログラムの実行を停止します。

関数呼び出し

関数呼び出しは、関数名と、それに続く、括弧で囲まれてコンマで区切られた式のリストからなっています。各式は、関数の引数です。引数として渡されるアレイ全体を、アレイ名とそれに続く [ ] (左右の大括弧) で指定します。すべての関数の引数は、値で渡されます。結果として、仮パラメーターに対して行われた変更は、実引数には影響を与えません。関数が return ステートメントを実行して終了すると、その関数の値は return ステートメントの括弧内の式の値になりますが、式が与えられていない場合、または return ステートメントがない場合は 0 になります。

sqrt(expression) の結果は、式の平方根です。結果は、最下位の小数桁まで切り捨てられます。結果のスケールは、式のスケールまたは scale の値のうち、どちらか大きい方です。

length(expression) の結果は、式の有効 10 進数の桁の総数です。結果のスケールは 0 です。

scale(expression) の結果は、式のスケールです。結果のスケールは 0 です。

bc プログラム内のストレージ・クラスは、グローバルと自動 (ローカル) の 2 つしかありません。関数に対してローカルになる ID のみを、auto キーワードで宣言する必要があります。関数の引数は、その関数に対してローカルです。 他のすべての ID はグローバルと見なされ、すべての関数に使えます。グローバルかローカルかに関係なく、すべての ID の初期値は 0 です。auto として宣言された ID は、関数に入る時に割り当てられ、関数から戻る時に解放されます。したがって、この種の ID は関数呼び出しの間で値を保持しません。auto アレイは、アレイ名とそれに続く [ ] (左右の大括弧) で指定します。関数に入る時に、パラメーターおよび自動変数として表示される名前の古い値は、スタックにプッシュされます。関数が値を戻すまで、これらの名前への参照は新しい値のみを参照します。

また、この関数から呼び出される他の関数からこれらの名前への参照も、いずれかの関数がローカル変数に同じ名前を使うまで、新しい値を参照します。

-l 数学ライブラリー内の関数

-l フラグを指定すると、次の関数が定義されます。

項目 説明
s(expression) expressionx の正弦を指定します。expression の単位はラジアンです。
c(expression) expressionx の余弦を指定します。expression の単位はラジアンです。
a(expression) expressionx の逆正接を指定します。expression の単位はラジアンです。
l(expression) expression の自然対数を指定します。
e(expression) expression の指数を指定します。
j(expression,expression) 整数順のベッセル関数を指定します。

上記の各関数の呼び出しのスケールは、関数呼び出し時の scale キーワードの値です。数学関数のドメインの外側にある引数を指定して上記のいずれかの関数を呼び出すと、 動作は不定になります。

フラグ

項目 説明
-c File パラメーターをコンパイルしますが、dc コマンドは呼び出しません。
-l (小文字の L) 数学関数のライブラリーを定義し、scale 変数を 20 に設定します。

終了状況

このコマンドは次の終了値を戻します。

項目 説明
0 正常終了。
1 構文エラーが発生したか、入力ファイルにアクセスできませんでした。
未指定 他のエラーが発生しました。

  1. bc コマンドを計算器として使うことができます。 scale 変数を設定するかどうか、およびどの値に設定するかに応じて、分数が表示されます。次のように入力します。
    
    bc
    1/4
    画面には 0 のみが表示されます。 scale 変数を設定してコメントを追加するには、次のように入力します。
    scale = 1 /* Keep 1 decimal place */
    1/4
    画面には 0.2 と表示されます。次のように入力します。
    
    scale = 3 /* Keep 3 decimal places */
    1/4
    画面には 0.250 と表示されます。次のように入力します。
    
    16+63/5
    画面には 28.600 と表示されます。次のように入力します。
    (16+63)/5
    画面には 15.800 と表示されます。次のように入力します。
    71/6
    画面には 11.833 と表示されます。

    bc コマンドは、Enter キーを押すと代入を除く各式の値を表示します。

    bc コマンドの式をキーボードから直接入力する場合、bc コマンド・セッションを終了してシェル・コマンド・ラインに戻るには、ファイルの終わり (Ctrl-D) キー・シーケンスを押します。

  2. C のようなプログラムを作成して実行する場合は、次に示すようなコマンドを入力します。
    bc  -l prog.bc
    e(2) /* e squared */
    ma
    画面には 7.38905609893065022723 と表示されます。以下のように入力します。
    f(5)   /* 5 factorial */
    画面には 120 と表示されます。以下のように入力します。
    
    f(10)   /* 10 factorial */
    画面には 3628800 と表示されます。

    このシーケンスは、prog.bc ファイル内に保存された bc プログラムを解釈し、 さらにキーボードから bc コマンド・ステートメントを読み取ります。-l フラグを指定して bc コマンドを開始すると、 数学ライブラリーが使えます。この例では、数学ライブラリーの e (指数) 関数を使い、 fprog.bc プログラム・ファイル内で次のように定義されています。

    /* compute the factorial of n */
    define f(n) {
     auto i, r;
     
     r = 1;
     for (i=2; i<=n; i++) r =* i;
     return (r);
    }
    for または while ステートメントの次のステートメントは、同じ行で始めなければなりません。bc コマンドの式をキーボードから直接入力する場合、bc コマンド・セッションを終了してシェル・コマンド・ラインに戻るには、ファイルの終わり (Ctrl-D) キー・シーケンスを押します。
  3. 挿入式を逆ポーランド表記法 (RPN) に変換する場合は、次のように入力します。
    bc  -c
    (a * b) % (3 + 4 * c)
    画面には次のように表示されます。
    
    lalb* 3 4lc*+%ps.

    このシーケンスは、bc コマンドの挿入表記式をコンパイルして、 dc コマンドが解釈できる式に変換します。dc コマンドは、拡張 RPN 式を計算します。コンパイルされた出力内の、各変数名の前の l は、 変数の値をスタックにロードする dc サブコマンドです。p は、スタックの最上部に値を表示し、 s. はレジスター . (ドット) 内に値を格納して最上部の値を廃棄します。このコマンドの標準出力をリダイレクトすることにより、RPN 式をファイルに保存して、dc コマンドに後で計算させることができます。bc コマンドの式をキーボードから直接入力する場合、bc コマンド・セッションを終了してシェル・コマンド・ラインに戻るには、ファイルの終わり (Ctrl-D) キー・シーケンスを押します。

  4. シェル内で pi の最初の 10 桁の近似値を変数 x に代入するには、次のように入力します。
    
    x=$(printf "%s¥n" 'scale = 10; 104348/33215' | bc)
    次に示す bc プログラムは、pi の同じ近似値にラベルを付けて、標準出力に出力します。
    
    scale = 10
    "pi equals "
    104348 / 33215
  5. 指数関数の近似値を計算する関数 (-l (小文字の L) オプションを指定すると、この種の関数が事前定義されます) を定義するには、次のように入力します。
    
    scale = 20
    define  e(x){
            auto a, b, c, i, s
            a = 1
            b = 1
            s = 1
            for (i = 1; 1 == 1; i++){
                    a = a*x
                    b = b*i
                    c = a/b
                    if (c == 0) {
                            return(s)
                    }
                    s = s+c
            }
    }
    最初の 10 個の整数の指数関数の近似値を出力するには、以下のように入力します。
    for (i = 1; i <= 10; ++i) {
            e(i)
    }

ファイル

項目 説明
/usr/bin/bc bc コマンドが入っています。
/usr/lib/lib.b 数学ライブラリーが入っています。
/usr/bin/dc 卓上計算機が入っています。