今回は電卓コマンドのbcを使ってみましょう。bcコマンドはUNIX系OS上で動作します。ラズベリーパイでもRaspberry Pi OS上で実行できます。パソコンなんて持ってないという人でもiPhoneならa shellを入れれば簡易的なシェルを使う事ができます。今回のbcも使えます。Windows版のbcは以下のページからダウンロードして使うことができます。ダウンロード後はbc.exeのアイコンをダブルクリックするかコマンドライン/PowerShellから起動して実行できます。
https://gnuwin32.sourceforge.net/packages/bc.htm
OSに用意されている電卓
bcは入力された指定された式を計算するものです。まあ、要するに簡易電卓です。高機能なコンピュータが目の前にあるのに、なぜか電卓があるというのが不思議な気もしますが、簡単な計算なら電卓の方がコストが低いからかもしれません。多くのOSでは電卓が用意されています。macOS標準の電卓なら普通の電卓に加えて関数・科学用とプログラマ用の電卓機能が用意されています。
Windowsの電卓では日付の計算もできるようになっています。多分、標準で用意されている電卓としてはWindowsが一番高機能で便利ではないかと思います。他にも様々な単位変換もできます。
Raspberry Pi OSにも電卓が用意されています。こちらはmacOS、Windowsと比べると機能は多くありませんが、十分な機能を備えています。
bcを使った簡単な計算
まずはbcを使って簡単な計算をしてみましょう。電卓に必要なのは加減乗除です。ほとんどは、この計算が主でしょう。
bcコマンドで計算するには、コマンドラインからそのままbcと入力します。
すると計算式の入力待ちになります。ここで、足し算をしてみましょう。2+3と入力したらリターンキーを押します。すると計算結果が表示されます。
もう少し複雑な計算をしてみましょう。bcでの計算式はカッコも使えます。(2+3)*4と入力してリターンキーを押します。すると計算結果が表示されます。カッコによる計算の優先順位が正しく反映されているのがわかります。ここらへんは普通の電卓よりも便利かもしれません。
ここで一旦電卓コマンドのbcを終了させて見ましょう。コントロールキーとCキーを押して止めることもできますが、bcには終了コマンドquitが用意されています。
quitと入力しリターンキーを押すとbcが終了します。
演算の精度
今度は割り算をしてみましょう。10/3と入力してください。
10÷3は3.3333...となるはずが、3とだけ表示されてしまっています。bcは特に設定しない限り演算した整数部分だけを出力してしまいます。
bcコマンドで小数部分も出力させる場合はscaleを使って小数点以下の桁数を指定します。例えば以下のようにすると小数点以下第8位まで出力します。
桁数を指定できるとしても、どこまでできるかという疑問を持つ人もいるかもしれません。ということでやってみると環境によって違うかもしれませんが、macOS (BigSur)では134217729までは指定可能でした。ちなみにscale=の後には計算式を使うことができるので最高精度(134217729)の式は以下のようになります。これより大きな値を指定するとエラーになります。
scale=2^27+1
ちなみに上記の計算式に出てくる^はべき乗を示します。2^3なら2の3乗、2^8なら2の8乗を示すことになります。主な演算記号をまとめると以下のようになります。
+ 加算
- 減算
* 乗算
/ 除算
% 剰余(割り算の余り)
^ べき乗
コマンドラインからの計算式を処理
bcはbcと入力した後に計算式を入力しても、なぜか計算してくれません。以下のように入力してもエラーが表示されるだけです。
bc '1+(2*3)'
コマンドラインだけでbcに計算させるにはechoなど標準出力できるコマンドと組み合わせる必要があります。 上記の計算の場合は以下のように書きます。
echo '1+(2*3)' | bc
正直なところ簡単な計算なら暗算でやるか普通の電卓を使った方が早くて簡単です。
とは言え普通の電卓や関数電卓よりも優れている点としてはコマンドラインから計算式を受け取って結果を標準出力できる事にあります。
という事でテキストファイルに入力された計算式をbcに渡して計算させてみましょう。
まず、計算式を入力した以下のようなテキストファイルを用意します。一行で1つの計算式にしておいてください。
このテキストファイルの名前はdata.txtとし、カレントディレクトリにあるものとします。カレントディレクトリではない場合はdata.txtの場所をパスで指定してください。これまでと同じデスクトップ上のsampleディレクトリに入れてあれば~/Desktop/sample/data.txtのようにパスを指定することになります。パスで指定するのが面倒ならcd ~/Desktop/sampleのようにcdコマンドを使ってディレクトリを移動しておきましょう。
data.txt
テキストファイルの内容をcatを使ってbcに渡します。行ごとの計算結果が出力されます。
cat data.txt | bc
出力結果をみると10/3の結果が3となってしまっています。どこかで精度を指定しないといけません。精度は計算前の行にscale=8のように指定します。
data.txtの内容を以下のように変更して実行してみましょう。
今度は10/3の計算結果が何か変です。桁数を指定した影響で結果がおかしくなってしまったようです。scaleで精度を指定すると以後の計算は指定した精度になってしまいます。仕方ないので精度を元に戻してから計算するようにします。以下のようにdata.txtの内容を変更してから実行しましょう。
今度は期待通りの結果になりました。とは言えscaleに1行使ってしまうのはイマイチ(1行に1つの計算式であるべきだみたいな考え)だという人もいるかもしれません。そういう場合には;(セミコロン)で区切って1行にまとめることができます。data.txtを以下のように変更してから実行しても先ほどと同じ結果が得られます。