# 逆正弦(近似) Inverse Sine Approximation # 引数 値 ($x) # 戻り値 逆正弦(ラジアン) ($InverseSineApproximation) sub INVERSESINE{ my ($x) = @_; my $InverseSineApproximation = 0; my $Sum = 0; my $X = abs($x); my $Num = 0; my $Den1 = 0; my $Den2 = 1; my $Den3 = 0; my $NumFactorial = 1; my $DenFactorial = 1; my $Pi = atan2(1, 1) * 4; my $Pi2 = $Pi / 2; my $Expansion = 20; # 値の確認 if($X > $Pi2){ return 0; } for(my $i = 0; $i <= $Expansion; $i++){ # 分子 $Num = $X ** ((2 * $i) + 1); # 分母 $Den1 = 2 ** (2 * $i); $Den3 = (2 * $i) + 1; if($i != 0){ # 分子 階乗 for(my $j = (2 * $i); $j > ((2 * $i) - 1); $j--){ $NumFactorial = $NumFactorial * $j; } # 分母 階乗 for(my $j = $i; $j > ($i - 1); $j--){ $DenFactorial = $DenFactorial * $j; } # 分母 $Den2 = $DenFactorial * $DenFactorial; } # 逆正弦(近似) InverseSine $Sum += ($NumFactorial * $Num) / ($Den1 * $Den2 * $Den3); } # 符号を負 $Sum = -$Sum if($x < 0); # 逆正弦(近似) Inverse Sine $InverseSineApproximation = $Sum; return $InverseSineApproximation; }