use strict;
use warnings;

use constant EPS => 1E-10;

sub f 
  {
  my $x = shift;
  return (1/($x + 1));
  }

my $y = integral(0, 1, 20, \&f);
printf("Integral f: [%.4f .. %.4f] = %.4f\n", 0.0, 1.0, $y);
# Ergebnis: Integral f: [0.0000 .. 1.0000] = 0.6931


sub integral #($a, $b, $imax, \&f(x))
  {
  my ($a, $b, $imax, $f) = @_;
  my $it = 0; 
  my $sum = &{$f}($a) + &{$f}($b);
  # Anfangswerte berechnen
  my $h = ($b - $a)/$imax;
  my $k = 2;
  for my $i (1 .. $imax-1)
    {
    $k = 6 - $k;   # 4, 2, 4, 2, ...
    $ sum += $k*&{$f}($a + $i*$h);
    }
  return ($h/3.0 * $sum); 
  }
