#!/usr/bin/perl -w use 5.034; p: print "A pagar por bono: "; chomp ( my $p = ); unless (defined $p && 0+$p eq $p) { goto p; } unless ($p >= 0){ goto p; } n: print "Número de años: "; chomp ( my $n = ); unless (defined $n && 0+$n eq $n) { goto n; } unless ($n >= 0) { goto n; } c: print "Pagos de cupón: "; chomp ( my $c = ); unless (defined $c && 0+$c eq $c) { goto c; } unless ($c >= 0) { goto c; } f: print "A recuperar por bono: "; chomp ( my $f = ); 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 = ); 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