Tcl – 数学関数

Tclのexprコマンドは数学関数をサポートしています。数学関数の使い方をいくつか紹介します。

abs関数

abs関数は絶対値を返します。

[書式]

abs(arg)

絶対値とは符号を取り除いた値のことをいいます。実数aが正数または0であれば、a自身、負数であれば符号を取り除いた値をaの絶対値といいます。

例. |5| = 5, |-5| = 5
正数5も負数-5も絶対値は5になります。

[使用例]]

% set x -5
-5
% expr abs($x)       ---(1)
5

% expr abs($x + 2)   ---(2)
3

[説明]

(1)変数xの値:-5の絶対値は5になります。

(2)()内に演算子も使えます。

$x + 2 は -5 + 2 = -3 ですが、-3の絶対値3を返します。

fmod関数

fmod関数はxをyで割った余りを浮動小数点で返します。

[書式]

fmod(x, y )

[使用例]

% expr fmod(5, 2)      ---(1)
1.0

% expr fmod(11,3)      ---(2)
2.0

% expr fmod(11.1, 3)   ---(3)
2.0999999999999996
% format %.12g [expr fmod(11.1, 3)]
2.1

[説明]

(1)

5 ÷ 2 = 2余り1なので、余りを小数点にした値1.0を返します。

(2)

11 ÷ 3 = 3余り2なので、余りを小数点にした値2.0を返します。

(3)

11.1 ÷ 3 = 3余り2.1ですが、Tcl8.5以降で小数点数を扱う場合はformatコマンドで整形する必要があります。
参考:Tcl8.5以降の挙動

pow関数

pow関数はxのy乗を計算した値を返します。(べき乗)

[書式]

pow(x, y )

[使用例]

% expr pow(2, 3)    ---(1)
8.0

% expr pow(10, 3)   ---(2)
1000.0

% expr pow(2, -2)    ---(3)
0.25

% expr pow(10, -3)   ---(4)
0.001

[説明]

(1) 2の3乗。

1 x 2 x 2 x 2 = 8 になります。

(2) 10の3乗。

1 x 10 x 10 x 10 = 1000 になります。

(3) 2の-2乗。

2¹  は 1 x 2 = 2 になります。
2⁰  は「1に2を0回かける」ので 1 になります。
2⁻¹ は「2⁰に1/2個かける」ので 0.5 になります。(2分の1)
2⁻² は「2⁻¹に1/2個かける」ので 0.25 になります。(4分の1)

(4) 10の-3乗

10¹  は 1 x 10 = 10 になります。
10⁰  は「1に10を0回かける」ので 1 になります。
10⁻¹ は「10⁰に1/10個かける」ので 0.1 になります。(10分の1)
10⁻² は「10⁻¹に1/10個かける」ので 0.01 になります(100分の1)
10⁻³ は「10⁻²に1/10個かける」ので 0.001 になります。(1000分の1)

int関数、round関数

int関数は小数点以下を切り捨てます。round関数は小数点以下を四捨五入します。

[書式]

int(arg )

round(arg)

[使用例]

% expr int(4.4)
4
% expr int(4.5)
4

% expr round(4.4)
4
% expr round(4.5)
5

ceil関数

ceil関数は小数点以下を切り上げます。戻り値は、少数部が0の浮動小数点数を返します。

[書式]

ceil(arg)

[使用例]

% expr ceil(12.3456)
13.0
% expr ceil(12)
12.0

double関数

double関数は数値を浮動小数点数に変換します。

[書式]

double(arg)

argが浮動小数点数の場合、argの値を返します。それ以外の場合、argを浮動小数点に変換して変換値を返します。

[使用例]

% expr double(12.3456)
12.3456
% expr double(12)
12.0

entier関数

entier関数は小数点以下を切り捨てます。int (arg ) と違うところは入力値または出力値に制限はありません。

[書式]

entier(age)

[使用例]

% expr int(1122334455667788.1234)
-628319156
% expr entier(1122334455667788.1234)
1122334455667788

rand関数、srand関数

rand関数は0以上1未満の乱数を返します。
srand関数はrand関数の擬似乱数の生成に種子(シード)を与えて初期化します。ageは整数でなければならない。

[書式]

rand()

srand(age)

[使用例1]

% expr rand()     ---(1)
0.5560532219503322
% expr rand() 
0.5865013192344929

% expr srand(10)  ---(2)
7.826369259425611e-5
% expr rand()
0.3153778814316624

% expr srand(10)
7.826369259425611e-5
% expr rand()
0.3153778814316624

[説明]

(1)

rand関数を実行すると擬似乱数を生成します。

(2)

srand関数で同じ値を設定すると、同じ値の乱数を生成します。実行ごとにことなる乱数を生成には違う値を設定します。簡便な方法として、時刻(秒)などが使われます。

[使用例2]

% expr rand() * 100          ---(1)
75.90084829176816

% expr rand() * (5-2)+2      ---(2)
2.5687755898427103

% set x [expr rand() * 100] ---(3)
28.997123674022557

% expr int($x)
28

[説明]

(1)

0から100未満の乱数を生成します。

(2)

rand()*(b-a)+a は a以上b未満の乱数を生成します。例では2以上5未満(2~4)の乱数を生成します。

※a以上b以下の乱数を生成する場合は(b-a+1)+a になります。

(3)

整数部分だけを取り出したい場合はint関数を使用して小数点以下を切り捨てます。
int関数の中に計算式を入れて1行で記述することもできます。

expr int (rand() * 100)

max関数、min関数

max関数は、カッコ内の数値の中から最大値を返します。
min関数は、カッコ内の数値の中から最小値を返します。

[書式]

max(x,…)
min(x,…)

[使用例]

% expr max(2,3,4,5,-6,-3)
5
% expr min(2,3,4,5,-6,-3)
-6

bool関数

bool関数関数はブール値0または1を返します。ゼロ以外の数値はtrueです。argが非数値文字列の場合、trueまたはfalseに一致するとブール値を生成します。

[書式]

bool(arg)

[使用例]

% expr bool(0)
0
% expr bool(1)
1
% expr bool(2)
1
% expr bool(true)
1
% expr bool(false)
0

三角関数

三角関数は以下の関数が使えます。

sin,cos,tan
asin,acos,atan
sinh,cosh,tanh
atan2

角度はラジアン[red]で表されます。
度数法 0°~ 360°⇒ 弧度法 0[red]~ 2π[red]

※π:円周率のパイ(PI)の事。

sinθの場合
0°= 0, 90°= 1, 180°= 0, 270°= -1, 360°= 0 となる-1~1までの範囲の数値。

cosθの場合
0°= 1, 90°= 0, 180°= -1, 270°= 0, 360°= 1 となる-1~1までの範囲の数値。

tanθの場合
0°= 0, 45°= 1, 90°= ∞, 135°= -1, 180°: 0, 225°= 1, 270°= -∞, 360°= 0 までの範囲の数値。

[使用例]

% expr acos(-1)    ---(1)
3.141592653589793
% expr sin(1.57)   ---(2)
0.9999996829318346

[説明]

(1)

数値:-1を与えると3.14が返されます。
3.14[red]は度数法で180°になります。

(2)

数値:1.57を与えると限りなく1に近い値が返されます。
1.57[red]は度数法で90°になります。

その他の数学関数

その他の数学関数については、必要に応じてコマンドリファレンスを参照してください。

mathfunc manual page - Tcl Mathematical Functions
expr
Tclers wiki

この記事以外のexprコマンドの使い方は、必要に応じて以下の記事を参考にしてください。

コメント

タイトルとURLをコピーしました