三角関数の使用
■この章で解説する組み込み関数
atan2, sin, cos
■この章で解説するモジュール
Math::Trig
■この章でできること
・三角関数を使用する
・πの値を使う
・逆三角関数を使用する
・双曲線関数を使用する
・度、ラジアン、グラジアンの相互変換

 Perlの組み込み関数に用意されている三角関数は、sin(サイン)、cos(コサイン)、atan2(アークタンジェント)の3つです。

sin
numのサイン(正弦)を返す
書式
sin num
引数
num:
角度(ラジアン)
戻り値
numのサイン(正弦)

cos
numのコサイン(余弦)を返す
書式
cos num
引数
num:
角度(ラジアン)
戻り値
numのコサイン(余弦)

atan2
y/xのアークタンジェント(逆正接)を返す
書式
atan2 y, x
引数
y:
分子
x:
分母
戻り値
y/xのアークタンジェント(逆正接)

 では、サンプルソースです。

#!/usr/bin/perl

#############################################
# 三角関数のサンプル1
# Author: "Perl Programming Tips"
#############################################

# 逆正接(アークタンジェント)
$pi = atan2(1,1) *4;
print "pi: $pi\n\n";

# 正弦(サイン)
print "sin(0)   :" . sprintf("%.4f", sin(0)) . "\n";
print "sin(pi/2):" . sprintf("%.4f", sin($pi /2)) . "\n";
print "sin(pi/4):" . sprintf("%.4f", sin($pi /4)) . "\n\n";

# 余弦(コサイン)
print "cos(0)   :" . sprintf("%.4f", cos(0)) . "\n";
print "cos(pi/2):" . sprintf("%.4f", cos($pi /2)) . "\n";
print "cos(pi/4):" . sprintf("%.4f", cos($pi /4)) . "\n\n";

 実行結果は次のようになります。

[g@630m pl]$ perl math02_01.pl
pi: 3.14159265358979

sin(0)   :0.0000
sin(pi/2):1.0000
sin(pi/4):0.7071

cos(0)   :1.0000
cos(pi/2):0.0000
cos(pi/4):0.7071

[g@630m pl]$

 πの値は、上のようにatan2を使って求めることができます。

 これ以外の三角関数を使いたい場合は、Math::Trigモジュールを使います。Math::Trigモジュールは、三角関数のほか、πの値と角度変換用の関数も定義されています。Math::Trigモジュールの関数を以下に示します。

関数
説明
pi
円周率(π)
tan
正接(タンジェント)
asin
逆正弦(アークサイン)
acos
逆余弦(アークコサイン)
atan
逆正接(アークタンジェント)
cscまたはcosec
余割(コセカント)
sec
正割(セカント)
cotまたはcotan
余接(コタンジェント)
sinh
双曲線正弦(ハイパボリックサイン)
cosh
双曲線余弦(ハイパボリックコサイン)
tanh
双曲線正接(ハイパボリックタンジェント)
cschまたはcosech
双曲線余割(ハイパボリックコセカント)
sech
双曲線正割(ハイパボリックセカント)
cothまたはcotanh
双曲線余接(ハイパボリックコタンジェント)
asinh
逆双曲線正弦(ハイパボリックアークサイン)
acosh
逆双曲線余弦(ハイパボリックアークコサイン)
atanh
逆双曲線正接(ハイパボリックアークタンジェント)
acschまたはacosech
逆双曲線余割(ハイパボリックアークコセカント)
asech
逆双曲線正割(ハイパボリックアークセカント)
acothまたはacotanh
逆双曲線余接(ハイパボリックアークコタンジェント)
deg2rad
度からラジアンに変換
deg2grad
度からグラジアンに変換
grad2deg
グラジアンから度に変換
grad2rad
グラジアンからラジアンに変換
rad2deg
ラジアンから度に変換
rad2grad
ラジアンからグラジアンに変換

 それでは、これらを使ったサンプルを見てみましょう。まずは三角関数です。Math::Trigモジュールを使う場合は、定数piでπの値を参照することができます。

#!/usr/bin/perl

#############################################
# 三角関数のサンプル2
# Author: "Perl Programming Tips"
#############################################

use Math::Trig;

# 正接(タンジェント)
print "tan(pi)  :" . sprintf("%.4f", tan(pi)) . "\n";
print "tan(pi/2):" . sprintf("%.4f", tan(pi /2)) . "\n";
print "tan(pi/4):" . sprintf("%.4f", tan(pi /4)) . "\n\n";

# 正割(セカント)
print "sec(pi)  :" . sprintf("%.4f", sec(pi)) . "\n";
print "sec(pi/2):" . sprintf("%.4f", sec(pi /2)) . "\n";
print "sec(pi/4):" . sprintf("%.4f", sec(pi /4)) . "\n\n";

# 余割(コセカント)
print "csc(pi)  :" . sprintf("%.4f", csc(pi)) . "\n";
print "csc(pi/2):" . sprintf("%.4f", csc(pi /2)) . "\n";
print "csc(pi/4):" . sprintf("%.4f", csc(pi /4)) . "\n\n";

# 余接(コタンジェント)
print "cot(pi)  :" . sprintf("%.4f", cot(pi)) . "\n";
print "cot(pi/2):" . sprintf("%.4f", cot(pi /2)) . "\n";
print "cot(pi/4):" . sprintf("%.4f", cot(pi /4)) . "\n\n";

# 双曲線正弦(ハイパボリックサイン)
print "sinh(pi)  :" . sprintf("%.4f", sinh(pi)) . "\n";
print "sinh(pi/2):" . sprintf("%.4f", sinh(pi /2)) . "\n";
print "sinh(pi/4):" . sprintf("%.4f", sinh(pi /4)) . "\n\n";

# 双曲線余弦(ハイパボリックコサイン)
print "cosh(pi)  :" . sprintf("%.4f", cosh(pi)) . "\n";
print "cosh(pi/2):" . sprintf("%.4f", cosh(pi /2)) . "\n";
print "cosh(pi/4):" . sprintf("%.4f", cosh(pi /4)) . "\n\n";

# 双曲線正接(ハイパボリックタンジェント)
print "tanh(pi)  :" . sprintf("%.4f", tanh(pi)) . "\n";
print "tanh(pi/2):" . sprintf("%.4f", tanh(pi /2)) . "\n";
print "tanh(pi/4):" . sprintf("%.4f", tanh(pi /4)) . "\n\n";

 実行結果は次のようになります。

[g@630m pl]$ perl math02_02.pl
tan(pi)  :-0.0000
tan(pi/2):16331778728383844.0000
tan(pi/4):1.0000

sec(pi)  :-1.0000
sec(pi/2):16331778728383844.0000
sec(pi/4):1.4142

csc(pi)  :8165889364191922.0000
csc(pi/2):1.0000
csc(pi/4):1.4142

cot(pi)  :-8165889364191922.0000
cot(pi/2):0.0000
cot(pi/4):1.0000

sinh(pi)  :11.5487
sinh(pi/2):2.3013
sinh(pi/4):0.8687

cosh(pi)  :11.5920
cosh(pi/2):2.5092
cosh(pi/4):1.3246

tanh(pi)  :0.9963
tanh(pi/2):0.9172
tanh(pi/4):0.6558

[g@630m pl]$

 次は、角度変換関数のサンプルです。度、ラジアン、グラジアンを相互に変換することができます。

#!/usr/bin/perl

#############################################
# 三角関数のサンプル3
# Author: "Perl Programming Tips"
#############################################

use Math::Trig;

# 度からラジアンに変換
print "180[deg] = " . deg2rad(180) . "[rad]\n";

# 度からグラジアンに変換
print "180[deg] = " . deg2grad(180) . "[grad]\n";

# グラジアンから度に変換
print "300[grad] = " . grad2deg(300) . "[deg]\n";

# グラジアンからラジアンに変換
print "200[grad] = " . grad2rad(200) . "[rad]\n";

# ラジアンから度に変換
print "3pi[rad] = " . rad2deg(pi *3) . "[deg]\n";

# ラジアンからグラジアンに変換
print "3pi[rad] = " . rad2grad(pi *3) . "[grad]\n";

 実行結果は次のようになります。

[g@630m pl]$ perl math02_03.pl
180[deg] = 3.14159265358979[rad]
180[deg] = 200[grad]
300[grad] = 270[deg]
200[grad] = 3.14159265358979[rad]
3pi[rad] = 180[deg]
3pi[rad] = 200[grad]
[g@630m pl]$