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

名称

bc任意精度の演算言語とカルキュレイタ (計算機)

書式

bc [ -chlqv][ -e expression][ file ...]

解説

bc は、C に似ている言語のための会話型プロセッサですが、制限のない精度演算を提供しています。コマンドラインと与えられたファイルから任意の式を入力して、次に、標準入力を読み込みます。

利用可能なオプションは、次の通りです:

-c
bc は、 dc(1) のためのプリプロセッサで、 -c (コンパイルのみ) オプションが提示されないなら、実際に自動的に呼び出されます。この場合、実行している dc(1) プロセスによって解釈される代わりに、生成される dc(1) の命令は、標準出力に送られます。
-e expression, - -expression expression
expression を評価します。複数の -e オプションが指定されるなら、それらは、改行によって区切られたように、与えられた順序で処理されます。
-h, - -help
使用法の情報を印刷 (表示) します。
-l, - -mathlib
任意精度の数学ライブラリの仕様を許可します。ライブラリ中の定義は、コマンドラインの式で利用可能です。
-v, - -version
バージョン情報を印刷 (表示) します。

bc プログラムのための構文は、次の通りです: ‘L’は、文字 a-z を意味します。‘E’は、式を意味します。‘S’は、文を意味します。移植性のない拡張として、単一の文字の名前に加えて長い名前を使用することができます。長い名前は、小文字で始まりいくつかの小文字と数字が続くシーケンスです。下線文字 (‘_’) は、文字とみなされます。

コメント

は、/* と */ に囲まれます 
は、# と次の改行に囲まれます

改行は、それ自体、移植性のない拡張である、行コメントの一部ではありません。

名前

単純な変数: L 
配列の要素: L [ E ] 
単語 `ibase', `obase' と `scale' 
単語 `last' または単一のドット

他のオペランド

オプションの符号と小数点がある任意長の数 
( E ) 
sqrt ( E ) 
length ( E ) 有効桁数 
scale ( E ) 小数点以下の桁数 
L ( E , ... , E )

シーケンス‘\<newline><whitespace>’は、数値内で無視されます。

演算子

次の演算と論理演算子を使用できます。演算子の意味は、C 言語と同じです。それらは、優先順序が減少する順序でリストされています。同じグループの演算子は、同じ優先順序があります。

演算子 結合規則 説明
++ -- なし インクリメント, デクリメント
- なし 単項マイナス
^ べき乗
* / % 乗算, 除算, 剰余
+ - プラス, マイナス
= += -= *= /= %= ^= 代入
== <= >= != < > なし 関係演算子
! なし 論理 not
&& 論理 and
|| 論理 or

次の項目に注意してください:

  • 関係演算子は、すべての式に出現することができます。 IEEE Std 1003.2 (“POSIX.2”) 規格は、‘if’, ‘while’または‘for’文の条件式でのみ許可されています。
  • 関係演算子は、代入演算子より低い優先順序があります。これは、式 a = b < c がたぶんプログラマが意図したことでない、 (a = b) < c として解釈されるという、結果をもたらします。
  • C 言語と異なって、関係演算子は、すべて同じ優先順序であり、非結合です。式 a < b < c は、構文エラーとなります。
  • 論理演算子 (!, && and ||) は、移植性のない拡張です。
  • 論理 not (!) 演算子は、C 言語の同じ演算子よりはるかに低い優先順序となります。これは、式 !a < b!(a < b) として解釈されるという、結果をもたらします。慎重なプログラマは、論理演算子を含む式を書くとき、括弧を使用します。

E 
{ S ; ... ; S } 
if ( E ) S 
if ( E ) S else S 
while ( E ) S 
for ( E ; E ; E ) S 
null 文 
break 
continue 
quit 
二重引用符で囲まれた文字列 
print E ,..., E

文字列は、二重引用符を除いて、どんな文字でも含むことができます。 else 分岐があるif 文は、移植性がない拡張です。 for 文の 3 つの E のすべてが、空であってもかまいません。これは、移植性がない拡張です。 continue と print 文も、移植性がない拡張です。

print 文は、コンマで区切られた式のリストを取ります。リスト中の各式は、評価され、計算された値は、印刷され、変数 `last' に代入します。後続する改行は、印刷されません。また、式は、二重引用符で囲まれた文字列でも使用できます。これらの文字列の中では、次のエスケープシーケンスが、使用されます: ベルのための (警報) ‘\a’、バックスペースのための‘\b’、フォームフィードのための‘\f’、改行のための‘\n’、キャリッジリターンのための‘\r’、タブのための‘\t’、二重引用符のための‘\q’、バックスラッシュのための‘\\’です。バックスラッシュに続くその他の文字は、無視されます。文字列は、`last' に代入されません。

関数定義

define L ( L ,..., L ) { 
 auto L, ... , L 
 S; ... S 
 return ( E ) 
}

移植性のない拡張として、define 文の左中括弧は、次の行に現れてもかまいません。また、return 文は、次の形式で出現できます:

return 
return () 
return E

最初の 2 は、文“return 0”と同等です。最後の形式は、移植性のない拡張です。 return 文を指定しないことは、“return (0)”と書くのと同等です。

コマンドラインに -l フラグを指定することによってロードされる、数学ライブラリで利用可能な関数は、次の通りです。

s(x)
サイン
c(x)
コサイン
e(x)
指数関数
l(x)
自然対数
a(x)
逆正接関数
j(n,x)
Bessel function ベッセル関数

すべての関数の引数は、値渡し (pass by value) です。

式である文の値は、主な演算子が代入でないなら、印刷されます。印刷された値は、特別の変数 `last' に代入されます。これは、移植性のない拡張です。単一のドットは、`last' と同義語として使用されます。セミコロンまたは改行のいずれも、文を切り離します。 scale への代入は、 dc(1) の方法で算術演算に保持されるけた数に影響を与えます。 ibase または obase への代入は、それぞれ入力と出力の数値の基数を設定します。

同じ文字は、同時に、配列、関数と単純変数として使用されます。すべての変数は、プログラムにグローバルです。 `auto' 変数は、関数呼び出しの間にプッシュダウンされ (押し下げられ) ます。関数引数として配列を使用するか、またはそれらを自動的変数と定義するとき、空の角括弧は、配列名に続かなければなりません。

例えば

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 
 } 
}

は、指数関数の近似値を計算するための関数を定義し、

for(i=1; i<=10; i++) e(i)

は、最初の 10 の整数の指数関数の近似値を印刷します。

$ bc -l -e 'scale = 500; 2 * a(2^10000)' -e quit

は、円周率 (pi) の近似値を印刷します。

関連ファイル

/usr/share/misc/bc.library
数学ライブラリは、 -l オプションがコマンドラインに指定されるとき、読み込まれます。

関連項目

dc(1)

"BC - An Arbitrary Precision Desk-Calculator Language", /usr/share/doc/usd/06.bc/.

規格

bc ユーティリティは、 IEEE Std 1003.1-2008 (“POSIX.1”) 仕様に準拠しています。

フラグ[ -ce]は、その仕様の拡張です。

歴史

bc コマンドは、 Version 6 AT&T UNIX ではじめて登場しました。 bc コマンドの完全な書き直しは、 OpenBSD 3.5 ではじめて登場しました。

作者

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

バグ

quit’は、実行時ではなく、読み込まれるとき、解釈されます。

bc ユーティリティの GNU バージョンにある、いくつかの移植性のない拡張は、 (まだ) 実装されていません。

January 22, 2010 FreeBSD