任意精度計算機calcの使い方を説明します.作者が,どうやら説明する気がないみたいですので.
いや,こんなスーパーウルトラ超高性能スクリプト計算機,他には無いだろう?!
calc を起動して利用
これ使えば?べんりだし. あ?簡単に言うと 2+3[RETURN]で 5が表示されます.a=1とかしてa+2とかもできます.他にもまあ, 関数使ったりとかで矢印キーでポコポコ計算します.電卓ソフト?関数電卓?いや,あり得ねえだろう.式打ったら計算できて矢印キーで訂正できたほうが楽に決まっている
% calc
C-style arbitrary precision calculator (version 2.14.1.2)
Calc is open software. For license details type: help copyright
[Type "exit" to exit, or "help" for help.]
; 2+3
5
; exitA=2+3 とか代入すると変数が使える. sinとかcosとか数学関数も使える. ユーザー関数を定義したりできる. 2進数とかも得意. ちなみに任意精度計算なので, 計算精度は任意に高い. 助かりたければhelpと入力すれば良い.
calc をスクリプトで利用
スクリプトの最初はこんな感じ:
#!/usr/local/bin/calc -df
# 倍精度の15桁では足りないので, 100桁で計算
config("display",100);
config("epsilon",1e-100);
# 試しに, pi を計算してみる
pi=4*atan2(1,1);
# 3.14159265358979323846264338327950288419716939937510
# 582097494459230781640628620899862803482534211706 あってるわー
# では exp[i pi]=-1 を確認してみよう. 複素数も使えるしな
z=pi*1i;
exp(z);関数を定義
Joukowski変換と, その逆関数を定義してみよう.
define jf(z) {
if (abs(z)<=1) abort "Joukowski: Domain error"; # 単位円の外側だけで行きます
return z+1/z;
}
define jf_i(zeta) {
local az=abs(zeta)^2-4;
local s=(az+sqrt(az^2+16*im(zeta)^2))/2;
local r=(sqrt(s)+sqrt(s+4))/2;
local th=atan2(im(zeta)/sqrt(s),re(zeta)/sqrt(s+4));
return r*exp(1i*th);
}
#テスト
z=0.5+1i*1;
zeta=jf(z);
ret=jf_i(zeta);
printf("z= %f returned to %f\n",z,ret);ま,こんな感じですね. 実行してみると
z= 0.5+1i returned to 0.500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000+1.0000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000i
なるほど精密ですね.
線形代数を計算
行列も使えるだべよ.
最初に 行列の 書式を定義すると楽
$HOME/.calcrcに追記:
pi=4*atan(1)
d=config("resource_debug",0);
define ef()=config("mode","exp");
define ff()=config("mode","real");
d=config("resource_debug",d);
d=config("epsilon",1e-30);
d=config("display",40);
define mat_print(A) {
local i,j;
for (i = matmin(A,1); i <= matmax(A,1); i++) {
if (i != matmin(A,1))
printf("\t");
for (j = matmin(A,2); j <= matmax(A,2); j++)
printf(" %e", A[i,j]);
if (i != matmax(A,1))
printf("\n");
}
}
黄色のところが行列の定義ね
で,
mat A[3,3] ←3x3行列を定義
A[0,0]=A[1,1]=A[2,2]=1
A
1 0 0
0 1 0
0 0 1
A[0,1]=5 ←0行1列にアクセス
A
1 0 0
5 1 0
0 0 1
A[[3]] ←3番目の要素にアクセス
5
A={1,-1,3,4,7,3,2,0,-3} ←こういう芸も可能
A
1 -1 3
4 7 3
2 0 -3
mat B[3,1] ←ベクトルという概念はないので注意
B={1,2,3}
A*B ←行列同士の掛け算なら可能
8
2.7e1
-7
mat C[1,3]
A*C
Incompatible bounds for 2D * 2D matrix mul ←大学一年生程度の知能は持っている
det(A)
-81
mattrans(A) ←転置行列
1 4 2
-1 7 0
3 3 -3
A^12 ←こういう計算は得意
-6.50523859e8 -5.92020114e8 -4.34572698e8
2.770013736e9 2.499663545e9 1.776060342e9
-1.55737372e8 -1.3397776e8 -7.1093595e7
det(A^200) ←無限精度計算なので,どんな無茶にも答える
49774141229384921928814640297299616798025176696403143310697543174138631
93300588672960378941038799444233797200629740876278809425638436874294137
21362365168308462354511580569441704819185689833557769033177009327115444
20209776813054358564375904813214989625172486728130601236830118049920945
05499691756946329466238029256908317387659245893361869285485179777099016
847012698558309358412176001
inverse(A) ←余裕だな
~2.5925925925925925925925925925925925925926e-1 ~3.703703703703703703703
7037037037037037037e-2 ~2.9629629629629629629629629629629629629630e-1
~-2.2222222222222222222222222222222222222222e-1 ~1.11111111111111111111
11111111111111111111e-1 ~-1.1111111111111111111111111111111111111111e-1
~1.7283950617283950617283950617283950617284e-1 ~2.469135802469135802469
1358024691358024691e-2 ~-1.3580246913580246913580246913580246913580e-1
config("display",3) ←ちょっと桁多すぎる時はこうする
inverse(A)
~2.593e-1 ~3.704e-2 ~2.963e-1
~-2.222e-1 ~1.111e-1 ~-1.111e-1
~1.728e-1 ~2.469e-2 ~-1.358e-1
www
ビルド
ビルドするには, まずreadlineをインストールします.でここから,
cd x86_64 tar zxf ../calc-2.14.1.2.tar.bz2 cd calc-2.14.1.2 make fswatch -x /usr/local/ > files.log & sudo make install kill %1 fswatch_analyze.sh -c _binary files.log