package Manticore::Num::Trig; use strict; use warnings; use Math::BigRat lib => 'GMP'; # Sin, cos, first terms # 1/0! - x^2/2! + x^4/4! - x^6/6! sub proxCos { my ($steps, $x) = @_; my $mxsq = -$x*$x; my $sum = 0; my $fa = 1; for(1..$steps) { my $step2 = $_ * 2; $sum += $fa; $fa *= $mxsq/($step2*($step2-1)) } return $sum } # x/1! - x^3/3! + x^5/5! - x^7/7! sub proxSin { my ($steps, $x) = @_; my $mxsq = -$x*$x; my $sum = 0; my $fa = $x; for(1..$steps) { my $step2 = $_ * 2; $sum += $fa; $fa *= $mxsq/($step2*($step2+1)) } return $sum } # sin,cos, first terms and round by continued fractions # 1/0! - x^2/2! + x^4/4! - x^6/6! sub proxCosCF { my ($steps, $x) = @_; my $round = sub { Manticore::Num::ContinuedFraction::roundSteps($steps, $_[0]) }; my $mxsq = $round->(-$x*$x); my $sum = 0; my $fa = 1; for(1..$steps) { my $step2 = $_ * 2; $sum = $round->($sum+$fa); $fa = $round->($fa*$mxsq/($step2*($step2-1))) } return $sum } # x/1! - x^3/3! + x^5/5! - x^7/7! sub proxSinCF { my ($steps, $x) = @_; my $round = sub { Manticore::Num::ContinuedFraction::roundSteps($steps, $_[0]) }; my $mxsq = $round->(-$x*$x); my $sum = 0; my $fa = $x; for(1..$steps) { my $step2 = $_ * 2; $sum = $round->($sum+$fa); $fa = $round->($fa*$mxsq/($step2*($step2+1))) } return $sum } 1;