#!/usr/bin/perl -w

use 5.034;

V0:
print "Importe financiado: ";
chomp ( my $finan = <STDIN> );
goto V0 unless isnumberpositive($finan);

C:
print "Importe de los cupones anuales: ";
chomp ( my $cupon = <STDIN> );
goto C unless (isnumberpositive($cupon) || $cupon == 0);

R:
print "Valor reembolsado: ";
chomp ( my $reemb = <STDIN> );
goto R unless (isnumberpositive($reemb) || $reemb == 0);

N:
print "Número de años de vencimiento: ";
chomp ( my $n = <STDIN> );
goto N unless isnumberpositive($n);

say "";
say "El número de cupones anuales a pagar es ", $n-1, "\n";

my $err = 999999;
my $i = 0.1;
while (abs($err) > 0.00000001){   # 1/100 de millónesima, en tanto por 1
    $err = $finan - ( $cupon * (1-(1+$i)**-($n-1))/$i ) - $reemb * (1+$i)**(-$n);         # el último año no hay cupón
    if ($err > 0){
	$i -= rand()/1_000_000;
    }elsif ($err < 0){
	$i += rand()/1_000_000;
    }else{
	last;
    }
    print "\rinterés = $i -> err = $err"; 
}
printf ("\n\nInterés aprox. = %.09f -> err = %g \n\n", $i, $err);

exit 3;


sub isnumberpositive {
    my $s = shift;
    if ( (0+$s eq $s) && $s > 0){
	return 1;
    }
    return 0;
}

__END__
  He añadido que el cupón o el reembolso pueda ser 0 con el fin
  de cubrir todas las posibilidades.
  Así mismo, se informa de que no se paga el último cupón anual.

