bcは、 C言語に似た入力言語を持つ任意精度数学計算機プログラムです。対話型のコマンドラインユーザーインターフェースとスクリプト処理の両方をサポートしています。
典型的な対話型の使用方法としては、 Unixコマンドプロンプトbcでコマンドを入力し、数式を入力すると、(1 + 3) * 28出力されます。
bc は任意の精度で動作できますが、デフォルトでは小数点以下はゼロ桁なので、式は2/3次のようになります。0(結果は切り捨てられ、四捨五入されません。)これは、bc を初めて使用するユーザーを驚かせる可能性があります。bc-lのオプションでは、デフォルトのスケール(小数点以下の桁数)が 20 に設定され、言語にいくつかの追加の数学関数が追加されます。
bcは1975年にUnixバージョン6で初めて登場しました。これは、ベル研究所のロリンダ・チェリーが、ロバート・モリスとチェリーが共同で開発した任意精度計算機dcのフロントエンドとして作成したものです。dcは逆ポーランド記法で指定された任意精度計算を実行しました。bcは、シンプルなコンパイラ(数百行のコードからなる単一のyaccソースファイル)を介して、同じ機能への従来のプログラミング言語インターフェースを提供しました。このコンパイラは、 C言語に似た構文をdc記法に変換し、その結果をdcにパイプで渡しました。
1991 年にPOSIX はbc を厳密に定義し、標準化しました。この標準の実装は、現在も 4 つ残っています。1 つ目は、Unix およびPlan 9システムで使用されている、dc のフロントエンドである従来の Unix 実装です。2 つ目は、1991 年に Philip A. Nelson によって最初にリリースされたフリー ソフトウェアGNU bc です。GNU 実装は POSIX 標準を超える多数の拡張機能を備えており、もはや dc のフロントエンドではありません (バイトコード インタプリタです)。3 つ目は、2003 年にOpenBSDによって再実装されたものです。4 つ目は、Gavin Howard [ 1 ]による独立した実装で 、Android (オペレーティングシステム) [ 2 ] [ 3 ] 、 FreeBSD (13.3-RELEASE 以降) [ 4 ] [ 5 ] [ 6 ]、macOS (13.0 以降) [ 7 ] [ 8 ] [ 9 ]に含まれています。
オリジナルの UNIX バージョン 6 マニュアル[ 10 ]には「bc」が何を表しているかの説明がありません。長年にわたり、さまざまな情報源で「基本計算機」[ 11 ] 、 「ベンチ計算機」[ 12 ]、および「バイナリ計算機」[ 13 ]と呼ばれてきました。
POSIXで標準化されたbc言語は、従来、 dcプログラミング言語でプログラムとして記述されてきました。これは、dc言語の簡潔な構文の複雑さを回避しつつ、dc言語の機能に高いレベルでアクセスできるようにするためです。
この形式のbc言語には、1文字の変数名、配列名、関数名、ほとんどの標準的な算術演算子、およびC言語でおなじみの制御フロー構造(、および)が含まれています。C言語とは異なり、節の後にが続くことはありません。if(cond)...while(cond)...for(init;cond;inc)...ifelse
関数はキーワードを使用して定義されdefine、戻り値はreturnキーワードの後に括弧で囲んだ戻り値を使用して返されます。autoキーワード(C言語では省略可能)は、変数を関数のローカル変数として宣言するために使用されます。
すべての数値および変数の内容は任意精度数であり、その精度(小数点以下の桁数)はグローバルscale変数によって決定されます。
入力(対話モード)、出力、およびプログラム定数の数値基数は、予約変数(入力基数)および(出力基数)を設定することによって指定できibaseますobase。
出力は、計算結果を意図的に変数に代入しないことによって生成されます。
bc コードには、C/*と*/(開始コメントと終了コメント) の記号を使用してコメントを追加できます。
以下のPOSIX bc演算子は、 C言語の対応する演算子と全く同じように動作します。
+ - * / += -= *= /= ++ -- < > == != <= >= ( ) [ ] { }剰余演算子、%および は、%=グローバルscale変数が 0 に設定されている場合、つまりすべての計算が整数のみの場合に限り、C 言語の対応する演算子とまったく同じように動作します。それ以外の場合は、適切なスケールで計算が行われます。a%bは と定義されますa-(a/b)*b。例:
$ bc bc 1.06 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.これは一切保証のないフリーソフトウェアです。詳細は「warranty」と入力してください。scale=0; 5%3 2 scale=1; 5%3 .2 scale=20; 5%3 .00000000000000000002オペレーター
^ ^=
表面的にはC言語のビットごとの排他的論理和演算子に似ているが、実際にはbc整数べき乗演算子である。
特に注意すべき点は、負の数に対する演算子の使用は、^C言語の演算子の優先順位に従わないことです。bc-2^2の場合、答えは −4 ではなく 4 になります。
& | ^ && || &= |= ^= &&= ||= << >> <<= >>= ?:
POSIX bc では利用できません。
平方根sqrt()を計算する関数は、POSIX bcに組み込まれている唯一の数学関数です。その他の関数は、外部の標準ライブラリで利用できます。
引数のscale()精度(変数と同様)を決定する関数と、引数の有効な小数点以下の桁数を決定する関数も組み込まれています。scalelength()
bcの標準数学ライブラリ(-lオプションで定義)には、正弦、余弦、逆正接、自然対数、指数関数、および2パラメータベッセル関数Jを計算する関数が含まれています。これらの関数を使用して、ほとんどの標準的な数学関数(他の逆三角関数を含む)を構築できます。他の多くの関数の実装については、外部リンクを参照してください。
-lオプションはスケールを 20 に変更します[ 14 ]。そのため、剰余演算などが予期せず動作する可能性があります。たとえば、と入力してからコマンドを実行すると0 が出力されます。しかし、の後にと入力してからコマンドを実行すると 1 が出力されます。bc -lprint 3%2scale=0bc -lprint 3%2
プラン9 bcは、追加のprintステートメントを除いてPOSIX bcと同一です。
GNU bcはPOSIX標準をベースとしており、多くの拡張機能が含まれています。これはPOSIX標準のdcベースの実装とは完全に独立しており、C言語で記述されています。しかしながら、すべてのPOSIX bcプログラムは変更なしでGNU bcプログラムとして実行できるため、完全な後方互換性を備えています。
GNU bc の変数、配列、関数名は複数の文字を含むことができ、C からいくつかの演算子が追加され、特にif句の後には . が続くことができますelse。
出力は、計算結果を意図的に変数に代入しない(POSIX方式)か、追加されたprintステートメントを使用することによって実現されます。
さらに、readステートメントを使用すると、実行中の計算に数値を対話的に入力できます。
C言語スタイルのコメントに加えて、#特定の文字は、その後の次の改行までのすべてを無視する効果を持ちます。
最後の計算結果は常に、追加の組み込みlast変数に格納されます。
以下の論理演算子は、POSIX bc に含まれるものに加えて使用できます。
&& || !
これらは条件文(例えば、条件文内if)で使用できます。ただし、同等のビット演算や代入演算はまだ存在しないことに注意してください。
GNU bcで利用可能なすべての関数はPOSIXから継承されています。GNUディストリビューションには、これ以外の関数は標準で提供されていません。
bc^演算子は右辺に整数べき乗しか許容しないため、bc演算子を使用するユーザーが最初に作成する関数の1つは、浮動小数点指数を持つべき乗関数です。以下の2つの例は、標準ライブラリが既にインクルードされていることを前提としています。
/* x の整数部分を返す関数 */ define i ( x ) { auto s s = scale scale = 0 x /= 1 /* x を切り捨てる */ scale = s return ( x ) }/* x^y == e^(y*log(x)) という事実を利用する */ define p ( x , y ) { if ( y == i ( y )) { return ( x ^ y ) } return ( e ( y * l ( x ) ) ) }組み込み関数の逆正接関数a()を使用して円周率 πを計算します。
$ bc -lq scale=10000 4*a(1) # 1 の atan は 45 度で、ラジアンでは π/4 です。 #計算には数分かかる場合があります。 bc の構文はCの構文と似ているため、C で書かれた公開されている数値関数は、bc に簡単に変換できることが多く、bc の任意精度をすぐに利用できます。たとえば、Journal of Statistical Software (2004 年 7 月、第 11 巻、第 5 号) で、George Marsaglia は累積正規分布の次の C コードを公開しました。
double Phi ( double x ) { long double s = x , t = 0 , b = x , q = x * x , i = 1 ; while ( s != t ) s = ( t = s ) + ( b *= q / ( i += 2 )); return .5 + s * exp ( -.5 * q -.91893853320467274178L ); }bcの異なる構文に対応するために必要な変更をいくつか加え、定数「0.9189...」が実際にはln(2*PI)/2であることに注意すると、これは次のGNU bcコードに変換できます。
define phi ( x ) { auto s , t , b , q , i , const s = x ; t = 0 ; b = x ; q = x * x ; i = 1 while ( s != t ) s = ( t = s ) + ( b *= q / ( i += 2 )) const = 0.5 * l ( 8 * a ( 1 )) # 0.91893 ... return .5 + s * e ( - .5 * q - const ) }bc は、パイプを介して入力を受け取る非対話的に使用できます。これはシェルスクリプト内で便利です。例:
$ result = $( echo "scale=2; 5 * 7 /3;" | bc ) $ echo $result 11.66対照的に、bashシェルは整数演算のみを実行することに注意してください。例:
$ result = $(( 5 * 7 / 3 )) $ echo $result 11また、(bash、ksh、cshでは)ヒアストリングのイディオムを使用することもできます。
$ bc -l <<< "5*7/3" 11.66666666666666666666