#!/usr/bin/perl -l 

# pochodna($funkcja, $x, $delta) oblicza funkcje $funkcja (odwolanie
# do kodu) w punkcie $x. Parametr $delta jest uzywany jako dx; jesli go,
# nie podano, to poczatkowa wartosc $delta wynosi 1e-31 i jest zwiekszana 
# o jeden rzad wielkosci az do momentu zauwazenia znaczacej roznicy.
#
# Jesli funkcja $funkcja jest nieciagla, to obliczenia nie sa mozliwe.
#
sub pochodna {
    my ($funkcja, $x, $delta) = @_;

    # Wybranie wartosci delta, jesli nie zostala podana.
    #
    unless ($delta) {
        $delta = 1e-31;
        while ($x == $x + $delta) { $delta *= 10 }
    }

    # Obliczenie i zwrocenie przyblizenia pochodnej.
    #
    return ( &{$funkcja}( $x + $delta ) - &{$funkcja}( $x ) ) / $delta;
}

# 40% stopa przyrostu z wartoscia poczatkowa 5000
$uzytkownicy = sub { 5000 * ( 1.4 ** $_[0] ) };

# Data odlegla o rok, dokladnosc 0.01
#
$styczen_2002 = pochodna($uzytkownicy, 1,   0.1) / 366;
print $styczen_2002;

# Data odlegla o dwa i pol roku, dokladnosc 0.01
#
$lipiec_2003 = pochodna($uzytkownicy, 2.5, 0.1) / 365;
print $lipiec_2003;

