Perl/Funktionen für Berechnungen

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

[Bearbeiten] 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.

[Bearbeiten] 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
#!/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";
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.

[Bearbeiten] atan2 - Arkustangens eines Quotienten ermitteln

Erwartet als Parameter:

  1. eine beliebige erlaubte Zahl x,
  2. eine beliebige erlaubte Zahl y.

Gibt den Arkustangens des Quotienten aus x und y zurück.

Beispiel
#!/usr/bin/perl -w
 
use strict;
use CGI::Carp qw(fatalsToBrowser);
 
use constant { 
   PI => 4 * atan2(1,1) 
};
 
print "Content-type: text/plain\n\n", PI, "\n";
In einem rechtwinkligen Dreieck definiert das Verhältnis von Gegenkathete zu Ankathete den Tangens eines Winkels. Für ein gleichschenklig rechtwinkliges Dreieck sind die Basiswinkel 45°, der Tangens von 45° (entspricht pi/4 im Bogenmaß) ist also 1:

Der Arkustangens ist die Umkehrfunktion: atan2(1,1) = Pi / 4

Das Beispiel erzeugt mit der Funktion atan2 die Zahl Pi, da die Winkelmaße im Bogenmaß verwendet werden.

Da man im Verlauf eines Programmes eine solche Zahl gerne als Konstante verwendet, wurde hier das Pragma constant verwendet.

Siehe auch http://perldoc.perl.org/functions/atan2.html Siehe auch http://perldoc.perl.org/constant.html

[Bearbeiten] cos - Cosinus einer Zahl ermitteln

Erwartet als Parameter:

  1. eine beliebige erlaubte Zahl.

Gibt den Cosinus der Zahl zurück.

Beispiel
#!/usr/bin/perl -w
 
use strict;
use CGI::Carp qw(fatalsToBrowser);
 
use constant { 
   PI => 4 * atan2(1,1) 
};
my $out;
 
for(0..6){
  my $Winkel = PI * $_/6;
  $out .= sprintf("%.3f : %.3f\n", $Winkel , cos($Winkel) );
}
 
print "Content-type: text/plain\n\n", $out;
Das Beispiel speichert zuerst die Zahl PI in einer Konstanten. (Siehe atan2) Danach wird für die ersten 180 Grad alle 30 Grad der Bogenwinkel und dessen zugehöriger Cosinus-Wert berechnet, formatiert gespeichert und ausgegeben.

[Bearbeiten] 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
#!/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";
Das Beispiel erzeugt HTML-Code. Dabei wird der Exponentialwert von 1 ermittelt und in dem Skalar $x gespeichert. Das Ergebnis wird ausgegeben.

[Bearbeiten] 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
#!/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";
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 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.

[Bearbeiten] 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
#!/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";
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.

[Bearbeiten] 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
#!/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";
Im Beispiel wird ein Skalar $Eins definiert. Diesem Skalar wird das Ergebnis der Funktionlog 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
#!/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";
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.

[Bearbeiten] 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
#!/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; }
}
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.

[Bearbeiten] sin - Sinus einer Zahl ermitteln

Erwartet als Parameter:

  1. eine beliebige erlaubte Zahl.

Gibt den Sinus der Zahl zurück.

Beispiel
#!/usr/bin/perl -w
 
use strict;
use CGI::Carp qw(fatalsToBrowser);
 
use constant PI => 4* atan2(1,1);
 
sub tan{
   my $Winkel = shift;
   return( sin($Winkel) / cos($Winkel) );
}
print "Content-type:text/plain\n\n",
   "Der Tangens von 45 Grad ist: ", tan( PI/4 ), "\n";
Das Beispiel nutzt die sin und cos Funktionen, um die nicht implementierte tan Funktion zu erstellen.

Hierbei gilt: tan = sin / cos.

Um die Funktion zu testen, wird zunächst die Konstante PI definiert (Siehe atan2)

Am Schluss wird tan(45°) ausgegeben. Erwartet wird der Wert "1".

Siehe auch http://perldoc.perl.org/functions/sin.html

[Bearbeiten] sqrt - Quadratwurzel einer Zahl ermitteln

Erwartet als Parameter:

  1. eine beliebige Zahl größer 0.

Gibt die Quadratwurzel der Zahl zurück.

Beispiel
#!/usr/bin/perl -w
 
use strict;
use CGI::Carp qw(fatalsToBrowser);
 
my $x = 2;
 
print "Content-type:text/plain\n\n",
	sprintf( "sqrt(%d)  = %s\n", $x, sqrt($x)),
	sprintf( "%d ** 0.5 = %s\n", $x, $x ** 0.5 );
Die Funktion sqrt($x) ermittelt identische Werte zur Operation $x ** 0.5.

[Bearbeiten] 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
#!/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";
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.
Beachten Sie: seit Perl 5.004 garantiert Ihnen srand() vorhersagbare Resultate. Verzichten Sie also für Zufallszahlen auf srand().

Siehe auch http://perldoc.perl.org/functions/srand.html

Meine Werkzeuge
Namensräume

Varianten
Aktionen
Übersicht
Index
Mitmachen
Werkzeuge
Spenden
SELFHTML