ホーム > 使った

calc: C-style arbitrary precision calculator

ガイド

コマンドライン電卓をWindowsで使う

履歴

editor唯野
2020.10.25公開
2020.10.26修正
2020.10.27修正

電卓プログラムは数多くありますが、個人的に長らく使っているのが、ここでご紹介する calc: C-style arbitrary precision calculator です。元々はUNIXコマンドライン用で、シェルから直接コマンドと引数に計算式を渡してもよいですし、コマンド単体で起動して専用のプロンプト越しに実行することもできます。一番の特徴は入力した計算式を可視化でき、電卓でありながら名前の通りC言語風の関数呼び出しや独自の関数定義を行える点です。

Windowsの場合はCygwinやMinGWがあればソースからビルドできますが、参考までに私がMinGWでビルドしたバイナリ(2.12.7.1)を以下に上げておきます。なお、exeのみですのでhelpなどは無効です。ライセンスが GPL 2.1 ですのでビルド時のソースについては後段で解説します。

calc-static.exe (5MB)

使い方

というわけで実際に使ってみると上記のような感じになります。

一般的な四則演算はもちろんのこと sqrt() などを関数として利用できます。特筆すべきは「.」(ドット)が直前の計算結果を表す点です。GUIや物理的な電卓ですと直前以外に計算させた式や結果などはメモリ機能を使わない限り参照できませんが、これなら画面を見て直感的に再利用できます。計算を小分けにして結果を連続的に得たいときはもちろん、式を打ち間違えたり計算をやり直したいときに重宝します。このときシェルのように上下キーで実行した履歴を参照できるのも便利です。なお、exit で終了します。

以下は四則演算以外の主な演算子です。むろんビット演算も可能ですが「^」(ハット)がべき乗となるため、これは xor() で代用します。

//整数除算(剰余なし)
^べき乗
%Mod

ちなみに、使用できる組み込み関数一覧は本家に リスト があります。例えば「base(16),」だけで計算結果の基数を16進数に変更できますので、これだけでもプログラマの方には便利だと思います。

加えて個人的によく使う計算を独自関数として定義することができます。例えば、以下の m3() 関数の内容を直に打ち込むか、コピーして右クリックで貼り付けると、以降はこの関数(立米を返す)を使用できます。関数定義はC言語の経験者であれば直感的に分かると思いますし、制御構造や変数も使用可能です。

define m3(x, y, z){
	return((x/1000)*(y/1000)*(z/1000))
}

fefine function

実は以前にCygwinでビルドしたものだと事前定義した内容をファイルに保存しておき起動時に「-i read ファイル名.cal」とオプションを付ければ起動時に定義を読み込ませることができたのですが、MinGW 版だと読み込み後に /dev/tty がないとエラーになります。一方、Cygwin版だと今度は履歴の参照や入力文字の修正ができなかったという経緯があります。このため現状ではMinGW版を使用し、必要なときだけ定義を張り付けていますが、MinGW版でexeを単独起動し外部定義の読み込みをできている方がいらっしゃればご教授願います。

というわけで、コマンドラインというといかにも古いコンピュータらしく思えるかもしれませんが、「いいものはいい」ということで使えるものは使いましょう。

ビルド

ちなみに msys でのビルドは以下の手順で行っています。リンク後にcolコマンドがないとエラーになりましたが、exeができたのでまあいいか...

/home/ユーザ名/ に calc-2.12.7.1.tar.bz2 を解凍したら Makefile を開き以下のフラグを切替。また、MINGW32_NT-5.0 セクションで CC に -D__MSDOS__ を追加。

#HAVE_FPOS=
HAVE_FPOS= -DHAVE_NO_FPOS

#HAVE_FPOS_POS=
HAVE_FPOS_POS= -DHAVE_NO_FPOS_POS

#HAVE_SYS_TIME_H=
#HAVE_SYS_TIME_H= YES
HAVE_SYS_TIME_H= NO

CC= ${PURIFY} ${LCC} ${CCWERR} -D__MSDOS__

calc.c を開き550行目付近の履歴ファイル参照エラーの文言をなしに変更。(Windowsではexe単独で使用すると実体となる/usr/lib/hist.bindが開けないため。)

		case HIST_NOFILE:
//			fprintf(stderr,
//			    "%s: Cannot open bindings file \"%s\", "
//			    "fancy editing disabled.\n",
//			     program, calcbindings);
			break;

input.c を開き49行目のdefineをコメントアウト。

#if defined(__MSDOS__)
#include <limits.h>
//#define _fullpath(f,n,s) (_fixpath(n,f),f)
#define MSDOS_MAX_PATH PATH_MAX
#endif

後は msys のシェルから「make target=MINGW32_NT-5.0」でビルドします。なお、ビルドに使用したソースを calc-2.12.7.1.zip (11MB) よりダウンロードできます。

リソース