# Funktionen für Berechnungen

Allgemeines zu diesen Funktionen
abs - absoluten Wert einer Zahl ermitteln
atan2 - Arcus Tangens von y durch x ermitteln
cos - Cosinus einer Zahl ermitteln
exp - Exponentialwert einer Zahl auf Basis der Zahl "e" ermitteln
hex - Dezimalwert einer Hexadezimalzahl ermitteln
int - Ganzzahlanteil einer Zahl ermitteln
log - Natürlichen Logarithmus einer Zahl ermitteln
oct - Dezimalwert einer Oktalzahl ermitteln
rand - Zufallswert ermitteln
sin - Sinus einer Zahl ermitteln
sqrt - Quadratwurzel einer Zahl ermitteln
srand - Zufallsberechnung initialisieren

## Allgemeines zu diesen Funktionen

Perl stellt in seinem Kern nur wenige mathematische Funktionen zur Verfügung, da es eher als Sprache für Zeichenketten- und Dateiverarbeitung konzipiert ist. Es gibt jedoch mächtige Module, die Perl auch zu einer mathematisch mächtigen Sprache machen. Beachten Sie neben den hier beschriebenen Funktionen deshalb auch die Standardmodule, die sich problemlos einbinden lassen und viele weitere interessante Funktionen für mathematisch-naturwissenschaftliche und kaufmännische Berechnungen zur Verfügung stellen.

## abs - absoluten Wert einer Zahl ermitteln

Erwartet als Parameter:
1. eine beliebige erlaubte Zahl.

Gibt den positiven Wert der Zahl zurück, falls sie negativ ist. Ist die Zahl positiv, wird sie unverändert zurückgegeben.

### Beispiel eines vollständigen CGI-Scripts in Perl:

Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)

    #!/usr/bin/perl -w

    use strict;
    use CGI::Carp qw(fatalsToBrowser);

    my @Zahlen = (1463.45,2038.02,-12348.12,5671.12,-4939.48,-1124.09);

    print "Content-type: text/html\n\n";
    print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
    print "<html><head><title>Test</title></head><body>\n";
    print "<table border=\"1\">\n";
    print "<tr><th>schwarze Zahlen</th><th style=\"color:red\">rote Zahlen</th></tr>\n";
    foreach my $Zahl (@Zahlen) {
      if($Zahl >= 0) {
        print "<tr><td>$Zahl</td><td style=\"color:red\">&nbsp;</td></tr>\n";
      }
      else {
        my $Abszahl = abs($Zahl);
        print "<tr><td>&nbsp;</td><td style=\"color:red\">$Abszahl</td></tr>\n";
      }
    }
    print "</table>\n";
    print "</body></html>\n";

### Erläuterung:

Das Beispiel definiert eine Liste `@Zahlen`. Einige der Zahlen sind positiv, andere negativ. Anschließend wird HTML-Code ausgegeben. Dabei wird eine Tabelle mit zwei Spalten erzeugt. Links stehen positive (schwarze) Zahlen, rechts negative (rote) Zahlen. Die roten Zahlen sollen ohne das Minusvorzeichen, aber eben in roter Färbung dargestellt werden. Deshalb wird, falls eine Zahl negativ ist, die Funktion `abs` auf die Zahl angewendet. Das Ergebnis wird in dem Skalar `$Abszahl` gespeichert und ausgegeben.

## atan2 - Arcus Tangens von x durch y ermitteln

Erwartet als Parameter:
1. eine beliebige erlaubte Zahl x,
2. eine beliebige erlaubte Zahl y.

Gibt den Arcus Tangens von x durch y zurück.

### Beispiel eines vollständigen CGI-Scripts in Perl:

Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)

    #!/usr/bin/perl -w

    use strict;
    use CGI::Carp qw(fatalsToBrowser);

    print "Content-type: text/html\n\n";
    print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
    print "<html><head><title>Test</title></head><body>\n";
    my $Wert = atan2(1.394,5.01);
    print "Der Arcus Tangens von 5.01 durch 1.394 lautet $Wert\n";
    print "</body></html>\n";

### Erläuterung:

Das Beispiel übergibt der Funktion `atan2` die beiden Gleitkommazahlen 1.394 und 5.01. Die Funktion gibt den Arcus Tangens von 1.394/5.01 zurück. Zur Kontrolle wird HTML-Code mit dem Ergebnis ausgegeben.

## cos - Cosinus einer Zahl ermitteln

Erwartet als Parameter:
1. eine beliebige erlaubte Zahl.

Gibt den Cosinus der Zahl zurück.

### Beispiel eines vollständigen CGI-Scripts in Perl:

Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)

    #!/usr/bin/perl -w

    use strict;
    use CGI::Carp qw(fatalsToBrowser);

    print "Content-type: text/html\n\n";
    print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
    print "<html><head><title>Test</title></head><body>\n";
    my $Eins = cos(0);
    print "1 bleibt $Eins, wie bedingt bedacht\n";
    print "</body></html>\n";

### Erläuterung:

Das Beispiel erzeugt die Zahl 1 aus dem Cosinus von 0 (dessen Ergebnis 1 ist). Zur Kontrolle wird HTML-Code mit der Zahl in einem entfernt an Karneval erinnernden Sinnspruch ausgegeben.

## exp - Exponentialwert einer Zahl auf Basis der Zahl "e" ermitteln

Erwartet als Parameter:
1. eine beliebige erlaubte Zahl.

Gibt den Exponentialwert der Zahl zurück.

### Beispiel eines vollständigen CGI-Scripts in Perl:

Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)

    #!/usr/bin/perl -w

    use strict;
    use CGI::Carp qw(fatalsToBrowser);

    print "Content-type: text/html\n\n";
    print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
    print "<html><head><title>Test</title></head><body>\n";
    my $x = exp(1);
    print "x = $x\n";
    print "</body></html>\n";

### Erläuterung:

Das Beispiel erzeugt HTML-Code. Dabei wird der Exponentialwert von 1 ermittelt und in dem Skalar `$x` gespeichert. Das Ergebnis wird ausgegeben.

## hex - Dezimalwert einer Hexadezimalzahl ermitteln

Konvertiert einen als Zeichenkette vorliegenden Hexadezimalwert in eine entsprechende Dezimalzahl.

Erwartet als Parameter:
1. eine Zeichenkette, die einen gültigen Hexadezimalwert darstellt, also beispielsweise `"0xB56A"` oder `"B56A"`.

Gibt den entsprechenden Dezimalwert als numerischen Wert zurück.

### Beispiel eines vollständigen CGI-Scripts in Perl:

Anzeigebeispiel: So sieht's aus - mit dem Übergabeparameter 336699 für Dunkelblau
(Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)

    #!/usr/bin/perl -w

    use strict;
    use CGI::Carp qw(fatalsToBrowser);

    my $Farbe = $ENV{'QUERY_STRING'};
    my $RotwertHex = substr($Farbe,0,2);
    my $GruenwertHex = substr($Farbe,2,2);
    my $BlauwertHex = substr($Farbe,4,2);
    my $RotwertDez = hex($RotwertHex);
    my $GruenwertDez = hex($GruenwertHex);
    my $BlauwertDez = hex($BlauwertHex);

    print "Content-type: text/html\n\n";
    print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
    print "<html><head><title>Test</title></head><body>\n";
    print "Die Farbe #$Farbe hat folgende RGB-Anteile:<br>\n";
    print "Rotwert: $RotwertDez<br>\n";
    print "Gr&uuml;nwert: $GruenwertDez<br>\n";
    print "Blauwert: $BlauwertDez<br>\n";
    print "</body></html>\n";

### Erläuterung:

Das Beispiel-CGI-Script erwartet einen Übergabeparameter, der beim Aufruf über einen URI hinter einem Fragezeichen notiert wird. Der Übergabeparameter besteht aus einer HTML-typischen Farbangabe, jedoch ohne das einleitende Gatterzeichen #. Beispiel: `http://localhost/cgi-bin/test.pl?FF9933`.

Das Beispiel-Script ermittelt den übergebenen Parameter aus der CGI-Umgebungsvariablen QUERY_STRING und speichert den Wert im Skalar `$Farbe`. Mit Hilfe der Funktion substr werden die Anteile für Rot, Grün und Blau aus der hexadezimalen Angabe extrahiert. Wenn die übergebene Zahl beispielsweise FF9933 lautet, wird in `$RotwertHex` der Wert `"FF"` gespeichert, in `$GruenwertHex` der Wert `"99"` und in `$BlauwertHex` der Wert `"33"`. Aus diesen Hexadezimalangaben wird durch Anwendung der Funktion `hex` jeweils der entsprechende dezimale Farbanteil ermittelt. Das Beispiel gibt die ermittelten Farbanteile aus.

## int - Ganzzahlanteil einer Zahl ermitteln

Die Funktion dient einerseits dazu, den Ganzzahlanteil einer Kommazahl vom Nachkommateil zu trennen. Andererseits kann sie auch auf Zeichenketten angewendet werden. Dann interpretiert sie die Zeichenkette so lange, bis sie auf ein Zeichen stößt, das nicht mehr numerisch interpretiert werden kann.

Erwartet als Parameter:
1. eine Zahl oder Zeichenkette.

Liefert den als Ganzzahl interpretierbaren Teil der übergebenen Daten zurück.

### Beispiel eines vollständigen CGI-Scripts in Perl:

Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)

    #!/usr/bin/perl -w

    use strict;
    use CGI::Carp qw(fatalsToBrowser);

    my $Ganzzahl = 23;
    my $Kommazahl = 3.1415;
    my $Minuszahl = -3.999;

    my $Ganzzahl_Int = int($Ganzzahl);
    my $Kommazahl_Int = int($Kommazahl);
    my $Minuszahl_Int = int($Minuszahl);

    print "Content-type: text/html\n\n";
    print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
    print "<html><head><title>Test-Ausgabe</title></head><body>\n";
    print "$Ganzzahl nach Anwendung von int: $Ganzzahl_Int<br>\n";
    print "$Kommazahl nach Anwendung von int: $Kommazahl_Int<br>\n";
    print "$Minuszahl nach Anwendung von int: $Minuszahl_Int\n";
    print "</body></html>\n";

### Erläuterung:

Das Beispiel definiert verschiedene Skalare: eine normale Ganzzahl, eine Kommazahl und eine negative Zahl, ebenfalls eine Kommazahl. Daraufhin wird auf jeden der Skalare die Funktion `int` angewendet. Die Rückgabewerte werden in eigenen, neuen Skalaren gespeichert. Zur Kontrolle wird HTML-Code mit den Werten vor und nach Anwendung der `int`-Funktion ausgegeben.

## log - natürlichen Logarithmus einer Zahl ermitteln

Erwartet als Parameter:
1. eine beliebige erlaubte Zahl.

Gibt den natürlichen Logarithmus der Zahl zurück.

### Beispiel eines vollständigen CGI-Scripts in Perl:

Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)

    #!/usr/bin/perl -w

    use strict;
    use CGI::Carp qw(fatalsToBrowser);

    my $Eins = log(exp(1));
    print "Content-type: text/html\n\n";
    print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
    print "<html><head><title>Test-Ausgabe</title></head><body>\n";
    print "$Eins";
    print "</body></html>\n";

### Erläuterung:

Im Beispiel wird ein Skalar `$Eins` definiert. Diesem Skalar wird das Ergebnis der Funktion`log` zugewiesen. Die Zahl, die dieser Funktion übergeben wird, ist im Beispiel der Rückgabewert der Funktion exp, angewendet auf die Zahl 1. Da `exp` die Umkehrfunktion von `log` ist, ist das Ergebnis des verschachtelten Aufrufs beider Funktionen der Wert 1. Zur Kontrolle wird HTML-Code mit dem Ergebnis ausgegeben.

## oct - Dezimalwert einer Oktalzahl ermitteln

Konvertiert einen als Zeichenkette vorliegenden Oktalwert in eine entsprechende Dezimalzahl.

Erwartet als Parameter:
1. eine Zeichenkette, die einen gültigen Oktalwert darstellt, also beispielsweise `"755"` oder `"0755"`.

Gibt den entsprechenden Dezimalwert als numerischen Wert zurück.

### Beispiel eines vollständigen CGI-Scripts in Perl:

Anzeigebeispiel: So sieht's aus - mit der Rechteangabe 755 als Übergabeparameter
(Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)

    #!/usr/bin/perl -w

    use strict;
    use CGI::Carp qw(fatalsToBrowser);

    my $UnixRechtOct = $ENV{'QUERY_STRING'};
    my $DezRecht = oct($UnixRechtOct);

    print "Content-type: text/html\n\n";
    print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
    print "<html><head><title>Test-Ausgabe</title></head><body>\n";
    print "Die Dezimaldarstellung der Unix-Rechteangabe $UnixRechtOct lautet $DezRecht\n";
    print "</body></html>\n";

### Erläuterung:

Ein typischer bekannter Anwendungsfall für Oktalwerte sind die Rechtevergaben für User, Group und World im Unix-Dateisystem. Das Beispiel-CGI-Script erwartet so eine typische oktale Rechteangabe und ermittelt daraus den entsprechenden Dezimalwert. Dazu erwartet das Script einen Übergabeparameter, der beim Aufruf über einen URI hinter einem Fragezeichen notiert wird. Der Übergabeparameter besteht aus einem Oktalwert. Beispiel:
`http://localhost/cgi-bin/test.pl?0755`.

Das Script ermittelt den übergebenen Parameter aus der CGI-Umgebungsvariablen `QUERY_STRING` und speichert den Wert im Skalar `$UnixRechtOct`. Dieser Skalar wird wiederum der Funktion `oct` übergeben, die eine Dezimalzahl daraus erzeugt, die in `$DezRecht` gespeichert wird. Zur Kontrolle gibt das Script die beiden Werte aus.

## rand - Zufallswert ermitteln

Ermittelt eine Zufallszahl zwischen 0 und 1, wenn kein Parameter übergeben wird, oder eine Zufallszahl zwischen 0 inklusive und der Zahl `n` exklusive, wenn `n` als Parameter übergeben wird. Das Ergebnis ist eine Gleitpunktzahl.

Erwartet als Parameter:
1. (optional) eine Zahl. Wenn angegeben, wird eine Zufallszahl zwischen 0 und dieser Zahl ermittelt, ansonsten zwischen 0 und 1.

Gibt die ermittelte Zufallszahl zurück.

### Beispiel eines vollständigen CGI-Scripts in Perl:

Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)

    #!/usr/bin/perl -w

    use strict;
    use CGI::Carp qw(fatalsToBrowser);

    my @Zahlen;
    for(my $i = 0; $i < 7; $i++) {
      $Zahlen[$i] = int(rand(49) + 1);
    }
    my @Lottozahlen = sort(NummernSort @Zahlen);

    print "Content-type: text/html\n\n";
    print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
    print "<html><head><title>Test-Ausgabe</title></head><body>\n";
    print "Der Lottotip von Perl lautet:<br>\n";
    print "$Lottozahlen[0], $Lottozahlen[1], $Lottozahlen[2], $Lottozahlen[3], $Lottozahlen[4], $Lottozahlen[5]<br>\n";
    print "Die Zusatzzahl lautet: $Lottozahlen[6]\n";
    print "</body></html>\n";

    sub NummernSort {
     if($a < $b)
      { return -1; }
     elsif($a == $b)
      { return 0; }
     else
      { return 1; }
    }

### Erläuterung:

Das Script nimmt Ihnen die Entscheidung ab, sich Lottozahlen auszudenken. Es ermittelt 7 Zahlen (6 plus Zusatzzahl) zwischen 1 und 49. Die Zahlen werden in einer for-Schleife ermittelt. Damit wirklich ganze Zahlen zwischen 1 und 49 gefunden werden, wird dem Aufruf der `rand`-Funktion die Zahl 49 als Parameter übergeben. Damit werden jedoch nur Zahlen zwischen 0.0x und 48.9x ermittelt. Durch Hinzuzählen von 1 sind es Zahlen zwischen 1.0x und 49.9x. Indem auf diese gesamte Operation dann noch die Funktion int angewendet wird, kommen ganze Zahlen zwischen 1 und 49 heraus.
Um die Zahlen schön sortiert auszugeben, wird noch die Funktion sort angewendet. Da es sich um eine numerische Sortierung handelt, benutzt das Script auch die Hilfsfunktion für numerische Sortierung.
Das Script gibt die ermittelten Lottozahlen aus.

### Beachten Sie:

Bei dieser Art von Zufallszahlerzeugung handelt es sich nicht um "echte" Zufallszahlen, sondern um Pseudo-Zufallszahlen, die aufgrund eines Anfangswertes mit Hilfe eines Algorithmus erzeugt werden. Sie können diesen Anfangswert auch selbst bestimmen. Dazu dient die Funktion srand.

## sin - Sinus einer Zahl ermitteln

Erwartet als Parameter:
1. eine beliebige erlaubte Zahl.

Gibt den Sinus der Zahl zurück.

### Beispiel eines vollständigen CGI-Scripts in Perl:

Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)

    #!/usr/bin/perl -w

    use strict;
    use CGI::Carp qw(fatalsToBrowser);

    my $x = 2;
    my $Fx = sin($x) + sin(2*$x) - sin(3*$x) + sin(4*$x) - sin(5*$x) + 0.3*sin(25*$x);

    print "Content-type: text/html\n\n";
    print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
    print "<html><head><title>Test-Ausgabe</title></head><body>\n";
    print "$Fx\n";
    print "</body></html>\n";

### Erläuterung:

Das Beispiel zeigt eine Mehrfachanwendung der Funktion `sin` innerhalb einer Berechnung. Das Script gibt das Ergebnis der Berechnung aus.

## sqrt - Quadratwurzel einer Zahl ermitteln

Erwartet als Parameter:
1. eine beliebige Zahl größer 0.

Gibt die Quadratwurzel der Zahl zurück.

### Beispiel eines vollständigen CGI-Scripts in Perl:

Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)

    #!/usr/bin/perl -w

    use strict;
    use CGI::Carp qw(fatalsToBrowser);

    print "Content-type: text/html\n\n";
    print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
    print "<html><head><title>Test-Ausgabe</title></head><body>\n";
    for(my $i = 1; $i <= 1000; $i++) {
      my $Wurzel = sqrt($i);
      if($Wurzel == int($Wurzel)) {
        print "Quadratzahl von $Wurzel ist $i<br>\n";
      }
    }
    print "</body></html>\n";

### Erläuterung:

Das Beispiel-Script gibt HTML-Code aus. Dabei wird in einer for-Schleife für die Zahlen 1 bis 1000 mit `sqrt` die Quadratwurzel ermittelt und jeweils in dem Skalar `$Wurzel` gespeichert. Dann wird der darin gespeicherte Wert daraufhin abgefragt, ob er mit der Ganzzahl dieses Wertes identisch ist. Zu diesem Zweck wird die Funktion int angewendet.
Wenn `$Wurzel` und `int($Wurzel)` identisch sind, handelt es sich bei dem aktuellen Schleifenwert von `$i` um eine Quadratzahl. Ist das im Beispiel der Fall, wird eine entsprechende Zeile ausgegeben. Auf diese Weise gibt das Script alle Quadratzahlen zwischen 1 und 1000 aus.

## srand - Zufallsberechnung initialisieren

Wenn Sie mit rand Zufallszahlen erzeugen, benötigt Perl intern einen Initialisierungswert. Wenn Sie selber keinen Wert angeben, ermittelt Perl automatisch einen. Sie können den Wert jedoch auch selber angeben.

Erwartet als Parameter:
1. eine beliebige erlaubte Ganzzahl bzw. eine Zahl, von der der Ganzzahlanteil verwendet wird.

### Beispiel eines vollständigen CGI-Scripts in Perl:

Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)

    #!/usr/bin/perl -w

    use strict;
    use CGI::Carp qw(fatalsToBrowser);

    srand(42);
    my $Zufall_1 = rand();
    my $Zufall_2 = rand();

    srand(42);
    my $Zufall_3 = rand();
    my $Zufall_4 = rand();

    print "Content-type: text/html\n\n";
    print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
    print "<html><head><title>Test-Ausgabe</title></head><body>\n";
    print "Zufall 1: $Zufall_1<br>\n";
    print "Zufall 2: $Zufall_2<br>\n";
    print "Zufall 3: $Zufall_3<br>\n";
    print "Zufall 4: $Zufall_4\n";
    print "</body></html>\n";

### Erläuterung:

Das Beispiel verdeutlicht die Wirkungsweise von `srand` und den folgenden Aufrufen von `rand`. `srand` wird zweimal mit demselben Wert, nämlich mit der Zahl 42, initialisiert. Anschließend wird jeweils zweimal die Funktion `rand` aufgerufen, und die ermittelten Zufallswerte werden jeweils in eigenen Skalaren gespeichert. Das Beispiel gibt die vier Skalare aus. Die Werte von `$Zufall_1` und `$Zufall_3` sind dabei gleich, ebenso die Werte von `$Zufall_2` und `$Zufall_4`. Und das ist kein Zufall, sondern die Folge der Tatsache, dass jede bestimmte `srand`-Initialisierung die gleiche Serie von Zufallszahlen bei jedem anschließenden `rand`-Aufruf erzeugt.

| Funktionen für die Kontrolle des laufenden Scripts
| Funktionen für Listen bzw. Arrays und Hashes

© 2007 Impressum