# 正接(近似) Tangent Approximation # 引数 値 ($X) # 戻り値 正接(ラジアン) ($TangentApproximation) sub TANGENT{ my ($X) = @_; my $TangentApproximation = 0; my $Sine = &SINE($X); my $Cosine = &COSINE($X); # 正接(近似) Tangent $TangentApproximation = $Sine / $Cosine; return $TangentApproximation; } # 正弦(近似) Sine Approximation # 引数 値 ($x) # 戻り値 正弦(ラジアン) ($SineApproximation) sub SINE{ my ($x) = @_; my $SineApproximation = 0; my $X = abs($x); my $Sum = 0; my $Sign = 0; my $Num = 0; my $Factorial = 1; my $Pi = atan2(1, 1) * 4; my $Radian2Pi = 2 * $Pi; my $Expansion = 20; # 360度以上 if($X >= $Radian2Pi){ $X = $X - (int($X / $Radian2Pi) * $Radian2Pi); } for(my $i = 0; $i <= $Expansion; $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; } } $Sum += $Sign * ($Num / $Factorial); } # $xが負 $Sum = -$Sum if($x < 0); # 正弦(近似) Sine $SineApproximation = $Sum; return $SineApproximation; } # 余弦(近似) Cosine Approximation # 引数 値 ($x) # 戻り値 余弦(ラジアン) ($CosineApproximation) sub COSINE{ my ($x) = @_; my $CosineApproximation = 0; my $Sum = 0; my $X = abs($x); my $Sign = 0; my $Num = 0; my $Factorial = 1; my $Pi = atan2(1, 1) * 4; my $Radian2Pi = 2 * $Pi; my $Expansion = 20; # 360度以上 if($X >= $Radian2Pi){ $X = $X - (int($X / $Radian2Pi) * $Radian2Pi); } for(my $i = 0; $i <= $Expansion; $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; } } $Sum += $Sign * ($Num / $Factorial); } # 余弦(近似) Cosine $CosineApproximation = $Sum; return $CosineApproximation; }