Rundungsexperimente mit BigRat.
This commit is contained in:
parent
7472f87e85
commit
a41f5fb72a
50
tests/ratround.pl
Executable file
50
tests/ratround.pl
Executable file
@ -0,0 +1,50 @@
|
||||
#!/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;
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user