#!/usr/local/bin/perl -w use Memoize; memoize('f'); $t =0; while (){ chomp; $cf[$t]=$_; $t++; } $t--; $EPS=1; while (1){ $EPS /=2; last if (1+$EPS==1); } $a = 0; $b = 500; while (++$count < 1000){ $m = ($a+$b)/2; $max = f($a); $min = f($b); $mean = f($m); print "f(a)=$max f(b)=$min\n"; print "a=$a b=$b\nIRR $m -> npv $mean\n"; if ($max*$mean<0){ $b=$m; }elsif ($mean*$min<0){ $a=$m; }elsif (abs($mean)<=$EPS || $max == $min){ last; } } sub f{ my $r = shift; my $npv =0; for $j (0..$t){ $npv += $cf[$j]*((1+$r)**(-$j)); } return $npv; } __DATA__ -100 40 59 55 20 __END__ IRR is 28.57105425% (vid. wikipedia) WARNING: IRR is a polemical financial method