# 正弦(近似) Sine Approximation # 引数 値 ($x) # 戻り値 正弦(ラジアン) ($SineApproximation) sub SINE{ my ($x) = @_; my $SineApproximation = 0; my $Sine = 0; my $PrevSine = 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) + 1); if($i != 0){ # 分母 階乗 for(my $j = ((2 * $i) + 1); $j > ((2 * ($i - 1)) + 1); $j--){ $Factorial = $Factorial * $j; } } # 一つ前 $PrevSine = $Sine; # 正弦(近似) Sine $Sine += $Sign * ($Num / $Factorial); # 収束判定 last if(abs($Sine - $PrevSine) < $Epsilon); } # 正弦(近似) Sine $SineApproximation = $Sine; return $SineApproximation; }