Finance-Math-IRR
view release on metacpan or search on metacpan
lib/Finance/Math/IRR.pm view on Meta::CPAN
my $poly = Math::Polynom->new(%coeffs);
#
# Find a real root of the polynomial
#
$ARGS_SECANT{precision} = $precision;
_debug("trying secant method on interval [".$ARGS_SECANT{p0}."-".$ARGS_SECANT{p1}."] with precision ".
$ARGS_SECANT{precision}." and max ".$ARGS_SECANT{max_depth}." iterations");
# try finding the IRR with the secant metho
eval {
$root = $poly->secant(%ARGS_SECANT);
};
if ($@) {
# secant failed. let's make sure it was not a bug
my $error = $poly->error;
if ( grep( /^$error$/,
lib/Finance/Math/IRR.pm view on Meta::CPAN
_debug("failed to find an interval on which polynomial is >0 and <0 at the boundaries");
return undef;
}
# try finding the IRR with Brent's method
$ARGS_BRENT{precision} = $precision;
$ARGS_BRENT{a} = $poly->xneg;
$ARGS_BRENT{b} = $poly->xpos;
_debug("trying Brent's method on interval [".$ARGS_BRENT{a}."-".$ARGS_BRENT{b}."] with precision ".
$ARGS_BRENT{precision}." and max ".$ARGS_BRENT{max_depth}." iterations");
eval {
$root = $poly->brent(%ARGS_BRENT);
};
if ($@) {
# Brent's method failed
$error = $poly->error;
if ( grep( /^$error$/,
Math::Polynom::ERROR_NAN,
( run in 1.413 second using v1.01-cache-2.11-cpan-71847e10f99 )