use strict;
use bignum;
iter_fib(0);
sub iter_fib {
my @buffer = ( 1, 1, 2 );
my $phi = 0;
my $convergence = -1;
my $iter = 3;
while ( !$convergence->is_zero() ) {
# calculate next fibbonacci number
$buffer[2] = $buffer[0] + $buffer[1];
# calculate phi
( $phi, $convergence ) =
calcPhi( $buffer[0], $buffer[1], $buffer[2] );
# report
my $pad = ( $iter < 10 ) ? '0' : '';
print "Iter: $pad$iter\tPHI=$phi\t".
"DELTA$convergence\tBuffer:($buffer[0],".
" $buffer[1],"." $buffer[2])\n";
++$iter;
# shift the buffer
$buffer[0] = $buffer[1];
$buffer[1] = $buffer[2];
}
}
sub calcPhi {
my $argPrevPrev = shift;
my $argPrev = shift;
my $argCurr = shift;
my @ratio = ( $argPrev / $argPrevPrev,
$argCurr / $argPrev );
my $phi = $ratio[1];
my $convergence = $ratio[1] - $ratio[0];
return ( $phi, $convergence );
}
__END__
=pod
=head1 NAME
phi.pl - find phi using the fibonacci sequence
=head1 SYNOPSIS
Iterates through the fibbonacci numbers,
keeping a buffer of three numbers. Then it uses the
ratio of the current and previous fibonacci numbers to
calculate the golden ratio, a constant named phi.
Convergence is also calculated as a difference in
ratios. The program stops when it determines no
changes have occurred in successive steps (aka. it has
converged on PHI as far as the datatypes will allow).
=head1 QUESTIONS
What was I thinking when I wrote this ?
=cut
Last 2 lines of output on me compy:
Iter: 96 PHI=1.61803398874989484820458683436563811772 DELTA-0.00
+0000000000000000000000000000000000001 Buffer:(19740274219868223167
+, 31940434634990099905, 51680708854858323072)
Iter: 97 PHI=1.61803398874989484820458683436563811772 DELTA0
+Buffer:(31940434634990099905, 51680708854858323072, 83621143489848422
+977)
|