# 余弦(近似) Cosine Approximation # 引数 値 ($x) # 戻り値 余弦(ラジアン) ($CosineApproximation) sub COSINE{ my ($x) = @_; my $CosineApproximation = 0; my $Cosine = 0; my $PrevCosine = 0; my $X = 0; my $Sign = 0; my $Num = 0; my $Factorial = 1; my $Pi = atan2(1, 1) * 4; my $Radian2Pi = 2 * $Pi; my $Limit = 100; my $Epsilon = 1.0e-20; # $Radian2Pi = 360度 if((-$Radian2Pi < $x) && ($x < $Radian2Pi)){ $X = $x; }else { $X = $x - (int($x / $Radian2Pi) * $Radian2Pi); } for(my $i = 0; $i < $Limit; $i++){ # 符号 $Sign = (($i % 2) == 0 ? 1: -1); # 分子 $Num = $X ** (2 * $i); if($i != 0){ # 分母 階乗 for(my $j = 2 * $i; $j > (2 * ($i - 1)); $j--){ $Factorial = $Factorial * $j; } } # 一つ前 $PrevCosine = $Cosine; # 余弦(近似) Cosine $Cosine += $Sign * ($Num / $Factorial); # 収束判定 last if(abs($Cosine - $PrevCosine) < $Epsilon); } # 余弦(近似) Cosine $CosineApproximation = $Cosine; return $CosineApproximation; }