| 開発者 | ベル研究所のロバート・モリスとロリンダ・チェリー |
|---|---|
| 初回リリース | 1975年、48~49年前 |
| オペレーティング·システム | Unix、Unix ライク、Plan 9、FreeDOS |
| プラットフォーム | クロスプラットフォーム |
| タイプ | 指示 |
bcは、基本計算機の略で、 C プログラミング言語に似た構文を持つ「任意精度計算機言語」です。bc は通常、数学スクリプト言語または対話型数学シェルとして使用されます。
概要
典型的な対話的な使用法は、 Unixコマンドプロンプトbcでコマンドを入力し、次のような数式を入力することです。 (1 + 3) * 28出力されます。bcは任意の精度で動作しますが、実際には小数点以下は0桁にデフォルト設定されています。そのため、式は次のように2/3なります。0(結果は切り捨てられ、四捨五入されません)。この事実を知らない新しい bc ユーザーは驚くかもしれません。bc-lのオプションは、デフォルトのスケール(小数点以下の桁数) を 20 に設定し、言語にいくつかの追加の数学関数を追加します。
歴史
bc は、1975 年にバージョン 6 Unixで初めて登場しました。これは、ロバート モリスとチェリーによって書かれた任意精度計算機dcのフロントエンドとして、ベル研究所のロリンダ チェリーによって書かれました。 dc は、逆ポーランド記法で指定された任意精度の計算を実行しました。 bc は、 Cのような構文を dc 記法に変換し、その結果を dc にパイプする単純なコンパイラ(数百行のコードで構成される単一のyaccソース ファイル)を介して、同じ機能への従来のプログラミング言語インターフェイスを提供しました。
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]
実装
POSIX bc
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(出力基数)変数を設定することによって指定できます。
計算結果を意図的に変数に割り当てないことで出力が生成されます。
C/*および*/(コメントの開始と終了) シンボルを使用して、bc コードにコメントを追加できます。
数学演算子
Cと全く同じ
次の POSIX bc演算子は、 C の対応する演算子とまったく同じように動作します。
+ - * /
+= -= *= /=
++ -- < >
== != <= >=
()[]{}
Cに似ている
モジュラス演算子、およびは、グローバル変数が 0 に設定されている場合にのみ、C の対応する演算子とまったく同じように動作します。つまり、すべての計算は整数のみです。それ以外の場合は、計算は適切なスケールで行われます。は として定義されます。例:
%%=scalea%ba-(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と競合
オペレーター
^ ^=
表面的には C のビット排他的論理和演算子に似ていますが、実際は bc 整数指数演算子です。
特に注意すべき点は、負の数での演算子の使用は^C 演算子の優先順位に従わないことです。bc-2^2では、答えは -4 ではなく 4 になります。
C と比較して「欠けている」演算子
& | ^ && || &= |= ^= &&= ||= << >> <<= >>= ?:
POSIX bc では使用できません。
組み込み関数
平方根を計算する関数sqrt()は、POSIX bc の唯一の組み込み数学関数です。その他の関数は、外部の標準ライブラリで使用できます。
引数のscale()精度(変数と同様)を決定する関数と、引数の有効小数桁数を決定する関数も組み込まれています。
scalelength()
標準ライブラリ関数
bc の標準数学ライブラリ ( -lオプションで定義) には、正弦、余弦、逆正接、自然対数、指数関数、および 2 つのパラメータを持つベッセル関数 Jを計算する関数が含まれています。ほとんどの標準的な数学関数 (他の逆三角関数を含む) は、これらを使用して構築できます。他の多くの関数の実装については、外部リンクを参照してください。
-lオプションはスケールを 20, [10]に変更するため、モジュロなどの操作は予期せず動作する可能性があります。たとえば、と書いてからコマンドを実行すると、0 が出力されます。しかし、 と書いてからコマンドを実行すると、1 が出力されます。
bc -lprint 3%2scale=0bc -lprint 3%2
プラン9 bc
Plan 9 bc は、追加のステートメントを除いて POSIX bc と同じですprint。
GNU 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 つの関数は、標準ライブラリが組み込まれていることを前提としています。
POSIX bc の「power」関数
/* xの整数部分を返す関数 */
define i ( x ) {
auto s
s = スケール
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 ) ) )
}
πを10000桁まで計算する
$ bc -lq
scale=10000
4*a(1) # 1 の atan は 45 度で、ラジアンでは pi/4 です。
#計算には数分かかる場合 があります。
翻訳されたC関数
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...」が実際には log(2*PI)/2 であることに注意すると、これは次の GNU bc コードに変換できます。
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を使用する
bc はパイプ経由で入力することで非対話的に使用できます。これはシェル スクリプト内で便利です。例:
$結果= $( echo "スケール=2; 5 * 7 /3;" | bc ) $ echo $結果11.66
対照的に、bash シェルは整数演算のみを実行することに注意してください。例:
$結果= $(( 5 * 7 / 3 )) $エコー$結果11
here-stringイディオム (bash、ksh、csh の場合) を使用することもできます。
$ bc -l <<< "5*7/3" 11.66666666666666666666
参照
参考文献
- ^ GNU および BSD 拡張による Unix dc および POSIX bc の実装
- ^ 「Android のシェルとユーティリティ」。android.googlesource.com。
- ^ 「Platform/External/Bc - Google の Git」。
- ^ 「FreeBSD 13.3: 新機能と、これまでの経緯」。FreeBSDフォーラム。2024 年 3 月 5 日。
- ^ "bc(1)". man.freebsd.org .
- ^ 「bc « contrib - src - FreeBSD ソースツリー」cgit.freebsd.org。
- ^ 「Apple Open Source」. opensource.apple.com .
- ^ 「bc/bc at main · apple-oss-distributions/bc」。GitHub。
- ^ 「私のコードが別の OS を征服しました! | Gavin D. Howard」。
- ^ ab : 任意精度演算言語 – シェルおよびユーティリティ リファレンス、The Single UNIX 仕様、バージョン 4、The Open Group
- : 任意精度演算言語 – シェルおよびユーティリティ リファレンス、The Single UNIX 仕様、バージョン 4、The Open Group
- GNU bc マニュアルページ
- POSIX bc マニュアルページ
- – Plan 9プログラマーズマニュアル、第 1 巻
- 第 7 版 Unix bc マニュアル ページ 2006-10-08 にWayback Machineにアーカイブされました
- C-bc の設計と実装に関する comp.compilers の記事
- 第 6 版 Unix bc ソース コード、bc の最初のリリース、1975 年 5 月、bc 構文を dc 構文にコンパイル
- GNU bc ソースコード
外部リンク
- Dittmer, I. 1993. 倍精度演算における Unix コマンド dc および bc のエラー。SIGNUM Newsl. 28, 2 (1993 年 4 月)、8–11。
- 便利な GNU bc 関数のコレクション
- フリーソフトウェア財団の GNU bc (およびアルファ版)
- GnuWin32の Windows 用 bc
- Gavin Howard bc - Gavin Howard による bc の別のオープンソース実装で、GNU および BSD 拡張機能を備えています。
- X-bc - bc のグラフィカル ユーザー インターフェイス
- extensions.bc - 三角関数、指数関数、数論関数、およびいくつかの数学定数が含まれています
- Scientific_constants.bc - 粒子の質量、真空中の光速度や重力定数などの基本定数が含まれています。
