70 lines
1.3 KiB
Perl
70 lines
1.3 KiB
Perl
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;
|