manticore/tests/ratround.pl
2023-12-26 13:05:51 +01:00

51 lines
974 B
Perl
Executable File

#!/usr/bin/env perl
use strict;
use warnings;
use Math::BigRat;
use Math::Trig;
my $x = abs(Math::BigRat->new(-1/3));
print "$x\n";
for my $s(0..6) {
my $pi = ratFromFloatSteps($s, pi);
print "$s -> $pi\n";
}
my $pi = ratFromFloatEpsilon(0.000001, pi);
print " $pi\n";
sub ratFromFloatEpsilon {
my ($epsilon, $inp) = @_;
my $steps = 0;
my $old = ratFromFloatSteps($steps, $inp);
for(;;) {
$steps++;
my $n = ratFromFloatSteps($steps, $inp);
if(abs($old-$n) < $epsilon) {
return $n
} else {
$old = $n
}
}
}
sub ratFromFloatSteps {
my ($steps, $inp) = @_;
#print " [[ $steps $inp ]]\n";
if($inp < 0) { return ratFromFloatSteps($steps, -$inp) }
if(0 == $inp) { return Math::BigRat->new(0) }
if($steps <= 0) {
return Math::BigRat->new(int $inp);
}
my $prop = int $inp;
my $rem = $inp - $prop;
$prop = Math::BigRat->new($prop);
$rem = 1/ratFromFloatSteps($steps-1, 1/$rem);
return $prop + $rem;
}