#!/usr/bin/perl -w

use 5.034;

p:
print "A pagar por bono: ";
chomp ( my $p = <STDIN> );
unless (defined $p && 0+$p eq $p) { goto p; }
unless ($p >= 0){ goto p; }
n:
print "Número de años: ";
chomp ( my $n = <STDIN> );
unless (defined $n && 0+$n eq $n) { goto n; }
unless ($n >= 0) { goto n; }
c:
print "Pagos de cupón: ";
chomp ( my $c = <STDIN> );
unless (defined $c && 0+$c eq $c) { goto c; }
unless ($c >= 0) { goto c; }
f:
print "A recuperar por bono: ";
chomp ( my $f = <STDIN> );
unless (defined $f && 0+$f eq $f) { goto f; }
unless ($f >= 0) { goto f; }
r:
print "Tipo de interés en tanto por 1: ";
chomp ( my $r = <STDIN> );
unless (defined $r && 0+$r eq $r){ goto r; }
unless ($r >= 0 && $r < 1) { goto r; }

my $valor = bono($n, $r, $c, $f);
say "";
say "El valor del bono es de $valor";
my $result = $valor - $p;
say "con lo cual se gana o pierde en valor actual $result";
say "";

my $min = 9e99;
my ($cand, $rrr);
if ($result > 0){
    say "Cálculo del interés implícito:";
    for (my $rr =0; $rr <= 0.5; $rr += 0.00001){
	$cand = bono($n, $rr, $c, $f);
	if (abs($p-$cand) < $min){
	    $min = abs($p - $cand);
	    $rrr =  $rr;
	}
    }
    printf "%.05f\n", $rrr;
}
  
exit 2;

sub bono {
    my ($n, $r, $c, $f) = @_;
    my $v = 0;
    for my $i (1 .. $n){
	$v += $c / ((1 + $r)**$i) ;
    }
    $v += $f / ((1+$r)**$n) ;
    return $v;
}

__END__
  

$ perl bonos
  A pagar por bono: 920
  Número de años: 10
  Pagos de cupón: 5
  A recuperar por bono: 1000
  Tipo de interés en tanto por 1: 0.01
  
El valor del bono es de 952.643477346492
  con lo cual se gana o pierde en valor actual 32.6434773464916
  
Cálculo del interés implícito:
  0.01361
  
