bc(プログラミング言語)


Bc_(programming_language)

BCは、のために基本的な計算機(しばしばと称される卓上計算機)、「ある任意精度の計算言語に似た構文を有する」Cプログラミング言語。bcは通常、数学的スクリプト言語またはインタラクティブな数学的シェルとして使用されます。 紀元前 開発者
ロバート・モリスとローリンダ・チェリーのベル研究所、フィリップ・A.ネルソン
初回リリース
1975年、45〜46年前
オペレーティング・システム
Unix、Unixライク、Plan 9、FreeDOS
プラットホーム
クロスプラットフォーム
タイプ
指示

コンテンツ
1 概要2 歴史 3 実装
3.1 POSIX bc
3.1.1 数学演算子
3.1.1.1 まさにC
3.1.1.2 Cに似ています
3.1.1.3 Cと競合する
3.1.1.4 Cに関連する「欠落している」演算子
3.1.2 組み込み関数
3.1.3 標準ライブラリ関数
3.2 紀元前9年を計画
3.3 GNU bc
3.3.1 追加の演算子
3.3.2 関数
4 サンプルコード
4.1 POSIXbcの「べき」関数
4.2 円周率を10000桁に計算する
4.3 翻訳されたC関数
5 シェルスクリプトでのbcの使用
6 も参照してください
7 参考文献
8 外部リンク

概要
典型的なインタラクティブな使用法はbc、Unix コマンドプロンプトでコマンドを入力し、などの数式を入力することです(1 + 3) * 2。8出力されます。bcは任意の精度で機能しますが、実際にはデフォルトで小数点以下0桁になるため、式2/3は次のようになります。0。これは、この事実に気付いていない新しいbcユーザーを驚かせる可能性が-lbcのオプションは、デフォルトのスケール(小数点以下の桁)を20に設定し、言語にいくつかの数学関数を追加します。

歴史
bcは1975年にバージョン6Unixで最初に登場し、ベル研究所のロバートモリスとロリンダチェリーによって書かれました。bcの前には、同じ作者によって書かれた以前の任意精度の計算機であるdcがありました。dcは任意精度の計算を実行できますが、その逆ポーランド記法(RPN)構文(代数式の評価で多くの人に愛されています)は、フロー制御を表現するときにユーザーにとって不便であることが判明したため、bcはdcのフロントエンドとして記述されました。bcは非常に単純なコンパイラ(数百行の単一のyaccソースファイル)であり、新しいCのようなbc構文をdcの接尾辞表記に変換し、結果をdcにパイプしました。
1991年、POSIXは厳密に定義および標準化されたbcです。この標準の3つの実装は今日も存続します。1つは従来のUnix実装であり、DCのフロントエンドであり、UnixおよびPlan9システムで存続します。第二は、フリーソフトウェア のGNU最初のフィリップ・A.ネルソンによって1991年にリリースされ、紀元前。GNU実装には、POSIX標準を超える多数の拡張機能があり、dcのフロントエンドではなくなりました(バイトコードインタープリターです)。3つ目は、2003年のOpenBSDによる再実装です。

実装

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
次のPOSIXbc演算子は、対応するC演算子とまったく同じように動作します。+-* /+ =-= * = / =++-<>==!= <=> =()[] {}

Cに似ています
モジュラス演算子、%および%=グローバルな場合にのみ、正確にそのCの対応のように振る舞いscale、すべての計算は整数のみですつまり、変数が0に設定されています。それ以外の場合、計算は適切なスケールで行われます。a%bとして定義されa-(a/b)*bます。例:
$ bc bc 1.06 Copyright 1991-1994、1997、1998、2000 Free Software Foundation、Inc。これは、まったく保証のないフリーソフトウェアです。詳細については、「保証」と入力してscale = 0; 5%32スケール= 1; 5%3.2スケール= 20; 5%3.00000000000000000002

Cと競合する
オペレーター
^ ^ =
表面的にはCのビット単位の排他的論理和演算子に似ていますが、実際にはbc整数のべき乗演算子です。
特に^、負の数の演算子の使用は、C演算子の優先順位に従いません。-2^2-4ではなくbcの下で4の答えを与えます。

Cに関連する「欠落している」演算子
ビット単位、ブールおよび条件演算子:
&| ^ && ||&= | = ^ = && = || =<< >><< = >> =?:
POSIXbcでは使用できません。

組み込み関数
平方根sqrt()を計算するための関数は、POSIXbcの唯一の組み込み数学関数です。その他の関数は、外部の標準ライブラリで利用できます。
scale()(のように精度を求めるための関数scale引数の変数)length()にも内蔵され、その引数に有意な桁の数を決定するための機能。

標準ライブラリ関数
bcの標準数学ライブラリ(-lオプションで定義)には、正弦、余弦、アークタンジェント、自然対数、指数関数、および2つのパラメータベッセル関数 Jを計算するための関数が含まれています。ほとんどの標準的な数学関数(他の逆三角関数を含む)は、これらを使用して構築できます。他の多くの機能の実装については、外部リンクを参照して
bc標準ライブラリ
bcコマンド 関数 説明
s(x)
正弦
ラジアン単位の角度であるxを取ります
c(x)
余弦
ラジアン単位の角度であるxを取ります
a(x)
アークタンジェント
ラジアンを返します
l(x)
自然対数
e(x)
指数関数
j(n,x)
ベッセル関数
xの次数nのベッセル関数を返します。-lオプションは、20のスケールを変更する例えばモジュロとして物事が予期せず動作できるように。たとえばbc -l、コマンドをprint 3%2書き込んでscale=0からbc -lコマンドを実行print 3%2すると0が出力されます。ただし、コマンドを書き込んでからコマンドを実行すると1が出力されます。

紀元前9年を計画
Plan 9bcはPOSIXbcと同じですが、追加のprintステートメントが

GNU bc
GNU bcはPOSIX標準から派生しており、多くの拡張機能が含まれています。これは、POSIX標準のDCベースの実装とは完全に分離されており、代わりにCで記述されています。それでも、すべてのPOSIXbcプログラムはGNUbcプログラムとして変更されずに実行されるため、完全な下位互換性が
GNU bc変数、配列、および関数名には複数の文字が含まれるif場合があり、Cからさらにいくつかの演算子が含まれる場合がありelseます。特に、句の後に。が続く場合が
出力は、計算結果を変数に意図的に割り当てない(POSIXの方法)か、追加されたprintステートメントを使用することによって実現されます。
さらに、readステートメントを使用すると、実行中の計算に数値をインタラクティブに入力できます。
Cスタイルのコメントに加えて、#文字はそれ以降のすべてを次の改行まで無視します。
最後の計算の値は、常に追加の組み込みlast変数内に格納されます。

追加の演算子
次の論理演算子は、POSIXbcの論理演算子に追加されます。
&& || !
これらは、条件ステートメント(ifステートメント内など)で使用できます。ただし、同等のビット演算または代入演算はまだないことに注意して

関数
GNU bcで使用可能なすべての関数は、POSIXから継承されます。GNUディストリビューションでは、これ以上の機能は標準で提供され

サンプルコード
bc^演算子はその右側に整数のべき乗しか許可しないため、bcユーザーが最初に作成する可能性のある関数の1つは、浮動小数点指数を使用したべき関数です。以下の両方は、標準ライブラリが含まれていることを前提としています。

POSIXbcの「べき」関数
/ * xの整数部分を返す関数* / define i ( x ) { auto s s = スケール スケール = 0 x / = 1 / * xを切り捨て* / スケール = 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桁に計算する
組み込みのアークタンジェント関数a()を使用して円周率を計算します。
$ bc -lq scale = 100004 * a(1)#1のatanは45度で、ラジアンでpi / 4です。
#これは計算に数分かかる場合が

翻訳されたC関数
bcの構文はCの構文と似ているため、Cで記述された公開された数値関数は、非常に簡単にbcに変換できることが多く、これによりbcの任意精度がすぐに得られます。たとえば、Journal of Statistics Software(2004年7月、第11巻、第5号)で、GeorgeMarsagliaは累積正規分布の次のCコードを公開しました。
ダブルファイ(ダブルx ) {{ long double s = x 、t = 0 、b = x 、q = x * x 、i = 1 ;
while (s != t )
s = (t = s )+ (b * = q / (i + = 2 )); リターン0.5 + S * EXP (-0.5 * Q -.91893853320467274178L )。 }
bcの異なる構文に対応するためにいくつかの必要な変更を加え、定数「0.9189 …」が実際にはlog(2 * PI)/ 2であることに気付くと、これは次のGNUbcコードに変換できます。
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 0.5 + S * E (- 0.5 * Q – CONST )}

シェルスクリプトでのbcの使用
bcは、パイプを介した入力で、非対話的に使用できます。これはシェルスクリプト内で役立ちます。例えば:
$ result = $(echo “scale = 2; 5 * 7/3 ;” | bc )$ echo $ result 11.66
対照的に、bashシェルは整数演算のみを実行することに注意して
$結果は= $((5 * 7 / 3 ))$エコー $結果11
here-stringイディオム(bash、ksh、csh)を使用することもできます。
$ bc -l <<< "5 * 7/3 " 11.66666666666666666666

も参照してください
DCプログラミング言語 ホックプログラミング言語

参考文献
^ ネルソン、フィリップA.「bcコマンドマニュアル」。フリーソフトウェアファウンデーション。
bc:任意精度の算術言語–コマンドとユーティリティのリファレンス、Single UNIX Specification、The OpenGroupの第7号
GNUbcのマニュアルページ
POSIXbcのマニュアルページ
bc(1) –  Plan 9プログラマーズマニュアル、第1巻
第7版Unixbcのマニュアルページ
C-bcの設計と実装に関するcomp.compilersの記事
1975年5月からのbcの最初のリリースである第6版Unixbcソースコード。bc構文をdc構文にコンパイルします。
bcソースコード

外部リンク
Unixのウィキブックスガイドには、次のトピックに関するページがコマンド
Dittmer、I.1993。複数精度の算術演算用のUnixコマンドdcおよびbcのエラー。SIGNUMNewsl。28、2(1993年4月)、8–11。
便利なGNUbc関数のコレクション
Free SoftwareFoundationのGNUbc(およびアルファ版)
GnuWin32からのWindows用のbc
Gavin Howardbc -GNUおよびBSD拡張機能を備えたGavinHowardによるbcの別のオープンソース実装
X-bc-bcへのグラフィカルユーザーインターフェイス
extensions.bc -三角法の関数、指数関数、数論の機能といくつかの数学定数が含まれています
Scientific_constants.bc-粒子の質量、真空中の光速や重力定数などの基本定数が含まれています