Kapitel I Mathematische Funktionen
Über die Grundrechenarten hinaus werden in PHP zahlreiche mathematischen Funktionen zur Durchführung von Berechnungen zur Verfügung gestellt. Diese Funktionen sind Inhalt des nun folgenden Abschnittes.
Zur Durchführung von mathematischen Berechnungen dienen die mathematischen Funktionen.
In den nachfolgenden Beispiel-Programmen werden zwei unterschiedliche Methoden verwendet. Diese beiden Methoden können generell bei allen Funktionsaufrufen angewendet werden. Sie werden hier noch einmal erwähnt, da die erste Methode besonders bei den mathematischen Funktionen angewendet wird.
|
Methode 1: Das Ergebnis der mathematischen Funktion wird unmittelbar ausgegeben, d. h., Berechnung und Ausgabe finden in Einem statt. Diese Methode bietet den Vorteil der kompakteren Schreibweise. |
|
Methode 2: Das Ergebnis der mathematischen Funktion wird in einer Variablen gespeichert. Diese Variable wird anschließend ausgegeben, d. h., Berechnung und Ausgabe finden in zwei Schritten statt. Diese Methode hat den Vorteil, daß das Ergebnis später noch mehrmals verwendet werden kann, ohne dafür die Funktion erneut aufrufen zu müssen und dabei Rechenzeit zu beanspruchen. |
I.1 Taschenrechner-Funktionen
Wurzel, e, ln,
log ...
Im Beispiel-Programm wird der Einsatz von »Taschenrechner-Funktionen« (Berechnung der Wurzel, e-Funktion, natürlicher Logarithmus, 10er Logarithmus, Potenzrechnung) sowie mathematische Konstanten behandelt.
Listing I.1 Datei ui01.php
<html>
<body>
<?php
echo "<b>Mathematische Konstanten:</b><br>";
echo "Kreiszahl Pi: " . M_PI . "<br>";
echo "oder so: " . pi() . "<br>";
echo "Euler'sche Zahl e: " . exp(1) . "<p>";
echo "<b>Wurzel, Potenz, Logarithmus:</b><br>";
$a=4.75;
echo "Variable a: $a <br>";
$erg = sqrt($a);
echo "Wurzel aus a: $erg<br>";
$erg = pow($a,2);
echo "a zum Quadrat (a hoch 2): $erg<br>";
$erg = pow($a,3);
echo "a hoch 3: $erg<br>";
$erg = log($a);
echo "ln(a) = Natürlicher Logarithmus von a : $erg<br>";
$erg = log10($a);
echo "log(a), 10er-Logarithmus von a: $erg<p>";
?>
</body>
</html>
Die Konstante pi läßt sich auf zwei Arten ermitteln: zum einen als konstanter Wert (M_PI), zum anderen als Ergebnis der Funktion pi(). Die Eulersche Zahl läßt sich nur über den »Umweg« der Exponential-Funktion (e hoch 1) errechnen.
Die Bildschirmausgabe hat folgendes Aussehen:
Abbildung I.1 Taschenrechner-Funktionen
|
I.2 Ganzzahl-Ermittlung, Extremwerte
In diesem Abschnitt beschäftigen wir uns mit dem Folgenden:
Umwandlung zur ganzen Zahl
|
Eine Zahl mit Dezimalstellen wird auf verschiedene Arten in eine Ganzzahl umgewandelt. |
Maximum, Minimum
|
Das Maximum bzw. das Minimum von unterschiedlichen Anzahlen von Werten wird ermittelt. |
Listing I.2 Datei ui02.php
<html>
<body>
<?php
echo "<b>Zahlen in Ganzzahlen verwandeln:</b><br>";
$a=4.75;
echo "Variable a: $a <br>";
echo "nächstniedrigere ganze Zahl zu a: " .
floor($a) . "<br>";
echo "nächsthöhere ganze Zahl zu a: " .
ceil($a) . "<br>";
echo "a kaufmännisch gerundet (ab .5 aufwärts): " .
round($a) . "<p>";
echo "<b>Maxima, Minima:</b><br>";
$b=5.37;
$c=30;
echo "Variable a: $a <br>";
echo "Variable b: $b <br>";
echo "Variable c: $c <br>";
echo "Maximum von a und b: " . max($a,$b) . "<br>";
echo "Maximum von a, b und c: " . max($a,$b,$c) . "<br>";
echo "Minimum von a und b: " . min($a,$b) . "<br>";
echo "Minimum von a, b und c: " . min($a,$b,$c) . "<p>";
?>
</body>
</html>
Eine Zahl mit Nachkommastellen kann auf verschiedene Weise gerundet werden:
|
nach unten, Funktion floor() |
|
nach oben, Funktion ceil() |
|
kaufmännisch (bis 0.4999 abwärts, ab .5000 aufwärts), Funktion round() |
Die Funktionen max() bzw. min() ermitteln aus einer beliebigen Menge an Zahlen die größte bzw. die kleinste Zahl. Sie können auch bei Arrays angewandt werden (s. Abschnitt über Arrays).
Die Bildschirmausgabe hat folgendes Aussehen:
Abbildung I.2 Ganzzahl-Ermittlung, Extremwerte
|
I.3 Trigonometrische Funktionen
sin, cos, tan
In diesem Abschnitt werden einige trigonometrischen Funktionen (Winkel-Funktionen: Sinus, Cosinus, Tangens usw.) vorgestellt. Dabei ist zu beachten, dass ein Winkel, der in Grad gegeben wird, zunächst in Bogenmaß umgerechnet werden muß.
Bogenmaß
Erst anschließend kann eine trigonometrische Funktion angewandt werden. Die Umrechnung von Winkel in Bogenmaß geschieht mit der folgenden Formel:
Bogenmass = Winkel / 180 * pi
Umgekehrt muss das Ergebnis einer Arcus-Funktion (Arcus-Sinus, Arcus-Cosinus, Arcus-Tangens) anschließend wieder von Bogenmaß in Grad umgewandelt werden.
Listing I.3 Datei ui03.php
<html>
<body>
<?php
echo "<b>Trigonometrische Funktionen:</b><br>";
$c=30;
echo "Variable c: $c (in Grad)<br>";
$cbm = $c / 180 * M_PI;
echo "Variable c: $cbm (in Bogenmaß umgerechnet)<br>";
echo "Sinus von c: " . sin($cbm) . "<br>";
echo "Cosinus von c: " . cos($cbm) . "<br>";
echo "Tangens von c: " . tan($cbm) . "<p>";
?>
</body>
</html>
Die Bildschirmausgabe hat folgendes Aussehen:
Abbildung I.3 Trigonometrische Funktionen
|
I.4 Zufallszahlen
In vielen Programmen (Spiele, Simulationen, Tests usw.) werden zufällige Zahlen gebraucht. Wie in fast jeder anderen Programmiersprache können diese Zufallszahlen auch in PHP zur Verfügung gestellt werden. Allerdings handelt es sich immer um Quasi-Zufallszahlen und keine mathematisch echten Zufallszahlen. Normalerweise genügen diese zufälligen Werte für die genannten Aufgaben.
Zufalls-Generator
Sie werden über einen sogenannten »Zufalls-Generator« produziert. Dieser muß nach Aufruf des Programmes zunächst einmal initialisiert werden, sonst werden bei jedem Programm-Aufruf die gleichen Abfolgen von dann nicht mehr zufälligen Zahlen produziert.
In PHP gibt es zwei verschiedene Zufalls-Generatoren:
rand, mt_rand
|
Der einfache Zufalls-Generator arbeitet mit der Funktion rand() und stellt beliebige Zahlen zwischen 0 und 32 767 zur Verfügung. Die Obergrenze kann mit der Funktion getrandmax() ermittelt werden. |
|
Der verbesserte Zufalls-Generator arbeitet mit der Funktion mt_rand() und stellt beliebige Zahlen zwischen 0 und 2 147 483 647 zur Verfügung. Die Obergrenze kann mit der Funktion mt_getrandmax() ermittelt werden. Es wird hier ein schnellerer und verbesserter Algorithmus zur Ermittlung der Zahlen verwendet. |
srand, mt_srand, microtime
Der einfache Zufalls-Generator wird mit Hilfe der Funktion srand(), der verbesserte mit der Funktion mt_srand() initialisiert. Beide Initialisierungen benutzen dabei die Funktion microtime(), die die Systemzeit als absolute Zahl in Mikrosekunden ermittelt. Diese ist natürlich zu jedem Zeitpunkt unterschiedlich, daher ergibt sich bei jedem Aufruf ein anderer Startwert für den Zufalls-Generator.
Listing I.4 Datei ui04.php
<html>
<body>
<?php
echo "<b>Einfache Zufallszahlen:</b><br>";
srand((double)microtime()*1000000);
echo "Größte mögliche Zufallszahl: " .
getrandmax() . "<br>";
echo "6 Zufallszahlen: ";
for ($i=1; $i<=6; $i++)
{
$erg = rand();
echo "$erg ";
}
echo "<p>";
echo "<b>Bessere Zufallszahlen:</b><br>";
mt_srand((double)microtime()*1000000);
echo "Größte mögliche Zufallszahl: " .
mt_getrandmax() . "<br>";
echo "6 bessere Zufallszahlen: ";
for ($i=1; $i<=6; $i++)
{
$erg = mt_rand();
echo "$erg ";
}
echo "<br>";
echo "15 bessere Zufallszahlen zwischen 1 und 49: ";
for ($i=1; $i<=15; $i++)
{
$erg = mt_rand() % 49 + 1;
echo "$erg ";
}
echo "<p>";
?>
</body>
</html>
Die »15 besseren« Zufallszahlen zwischen 1 und 49 werden mit Hilfe des Modulo-Operators (%) ermittelt. Der Zufalls-Generator erzeugt jedes Mal eine ganze Zahl zwischen 0 und 2 147 483 647. Teilt man jede beliebige Zahl, die dabei ermittelt werden kann, durch 49, so bleibt ein Rest, der zwischen 0 und 48 liegt. Wird noch der konstante Wert 1 addiert, so hat man das gewünschte Ergebnis (zwischen 1 und 49).
Die Bildschirmausgabe hat z. B. folgendes Aussehen:
Abbildung I.4 Zufallszahlen
|
I.5 Mischen
Bei näherem Hinsehen fällt auf, dass die Zufalls-Generatoren mehrmals die gleiche Zahl ermitteln können. Bei den »15 besseren« Zufallszahlen aus dem letzten Abschnitt sind dies z. B. die 16 (zwei Mal) und die 7 (drei Mal). Dies ist erklärbar, da bei jeder einzelnen Zufallszahl aus dem gesamten Bereich der Zufallszahlen, also von 0 bis 2 147 483 647 gezogen werden kann. Es wird keine Zahl von der Ziehung ausgeschlossen. Das Ergebnis der Modulo-Berechnung kann für mehrere gezogene Zahlen identisch sein.
Lotto
Für viele Problemstellungen ist es allerdings erforderlich, die bereits gezogenen Zahlen von der Ziehung auszuschließen. Man denke an die Ziehung der Lottozahlen, bei der ja unmöglich eine Kugel mit einem bestimmten Zahlenwert zwei Mal gezogen werden kann.
Karten
Genauso sieht es beim Mischen von Karten aus. Ziel ist die Ermittlung einer zufälligen Abfolge von Zahlen aus einem bestimmten Bereich, wobei jede Zahl nur einmal vorkommen darf.
In einem Programm, das diese Abfolge ermitteln soll, muss demzufolge festgehalten werden, welche Zahl bereits gezogen wurde. Sollte diese Zahl per Zufalls-Generator noch einmal gezogen werden, so muss die aktuelle Ziehung wiederholt werden.
Dies ist im folgenden Beispiel für die Folge der ganzen Zahlen von 1 bis 32 durchgeführt worden. Ordnet man anschließend jeder dieser Zahlen eine Karte aus einem Skatblatt (mit 32 Karten) zu, so wird durch das Programm das Mischen von Karten für ein Skatspiel durchgeführt.
Listing I.5 Datei ui05.php
<html>
<body>
<?php
mt_srand((double)microtime()*1000000);
/* 32 Zähler auf Null setzen */
for ($i=1; $i<=32; $i++) $cnt[$i]=0;
/* 32 mal ziehen */
for($i=1; $i<=32; $i++)
{
/* Ziehung wiederholen, falls Zähler */
/* der aktuellen Karte größer Null */
do
{
$z = mt_rand() % 32 + 1;
}
while($cnt[$z]>0);
/* Zähler erhöhen */
$cnt[$z] = $cnt[$z]+1;
/* Karte speichern */
$karte[$i] = $z;
}
/* 32 Karten ausgeben */
for ($i=1; $i<=32; $i++)
{
echo $karte[$i] . " ";
}
?>
</body>
</html>
Im Feld $karte werden die 32 verschiedenen zufälligen Zahlen gespeichert. Im Feld $cnt wird gespeichert, wie oft eine Zahl (=Karte) schon gezogen wurde. Zu Beginn wird dieser Wert für alle Karten auf 0 gestellt, während der Ziehung wird dieser Wert überprüft. Nach erfolgreicher Ziehung einer Zahl, die vorher noch nicht gezogen wurde, wird dieser Wert auf 1 gestellt.
Die Bildschirmausgabe hat z. B. folgendes Aussehen:
Abbildung I.5 32 Zahlen (Karten) werden gemischt
|
I.6 Formatierung von Zahlen
number_format
In diesem Abschnitt wird die formatierte Ausgabe von Zahlen erläutert. Diese Formatierung dient der übersichtlichen und einheitlichen Darstellung von Zahlen z. B. in Tabellen. Sie kann mit der Funktion number_format() durchgeführt werden.
Listing I.6 Datei ui06.php
<html>
<body>
<?php
echo "<b>Zahlen-Formatierung:</b><br>";
$d = 12.3 * 3098.55397 * 445.2;
echo "Variable d: $d<br>";
echo "Mit Tausender-Teilung (englisch), ohne
Dezimalstellen: " . number_format($d) . "<br>";
echo "Mit Tausender-Teilung, auf drei Dezimalstellen
gerundet (englisch): " . number_format($d,3) . "<br>";
echo "Mit Tausender-Teilung, auf drei Dezimalstellen
gerundet (deutsch): " . number_format($d,3,",",".") . "<p>";
?>
</body>
</html>
Die Funktion number_format() kann mit ein, zwei oder vier Parametern aufgerufen werden:
|
Falls Sie mit einem Parameter aufgerufen wird, so wird die Zahl mit Kommata als Tausender-Trennzeichen ausgegeben, und zwar ohne Nachkommastellen. |
|
Falls Sie mit zwei Parametern aufgerufen wird, so wird die Zahl mit Kommata als Tausender-Trennzeichen ausgegeben, und zwar mit der Anzahl an Nachkommastellen, die im zweiten Parameter angegeben ist. |
|
Falls Sie mit vier Parametern aufgerufen wird, so wird die Zahl mit dem vierten Parameter als Tausender-Trennzeichen ausgegeben, der gewünschten Anzahl an Nachkommastellen und dem dritten Parameter als Dezimal-Trennung. |
Die Bildschirmausgabe hat folgendes Aussehen:
Abbildung I.6 Zahlen-Formatierung
|
I.7 Stellenwert-Systeme
Ein Stellenwert-System ist ein System zur Darstellung von Zahlen durch Ziffern und Zeichen, bei denen der Wert einer Ziffer von der Stelle abhängt, an welcher sie sich innerhalb der Zahl befindet.
dezimal, dual, hexadezimal
Das gebräuchlichste Stellenwert-System ist das Dezimalsystem (Zahlen zur Basis 10). In der Informatik werden außerdem das Dualsystem (Basis 2) und das Hexadezimalsystem (Basis 16) eingesetzt, seltener das Oktalsystem (Basis 8).
Die benutzten Ziffern und Zeichen in den verschiedenen Systemen sind: Im Dualsystem 0 und 1, im Oktalsystem 0 bis 7, im Dezimalsystem 0 bis 9, im Hexadezimalsystem 0 bis 9 und A bis F. Die Buchstaben A bis F nehmen dabei die Dezimal-Werte von 10 bis 15 an.
Beispiele :
Dezimal-Zahl 456 : 4 mal 10 hoch 2 + 5 mal
10 hoch 1 + 6 mal 10 hoch 0
= 400 + 50 + 6 = 456
Dual-Zahl 11001 : 1 mal 2 hoch 4 + 1 mal 2
hoch 3 + 0 mal 2 hoch 2 +0 mal 2 hoch 1 + 1
mal 2 hoch 0 = 16 + 8 + 0 + 0 + 1 = 25 (dezimal)
Hexadezimal-Zahl 2A5F : 2 mal 16 hoch 3 + 10 mal
16 hoch 2 +5 mal 16 hoch 1 + 15 mal 16 hoch 0
= 2 mal 4096 + 10 mal 256 +5 mal 16 + 15 = 10847 (dezimal)
decbin, decoct, dechex
PHP stellt u. a. die Funktionen decbin(), decoct() und dechex() zur Umrechnung zwischen den verschiedenen Stellenwert-Systemen zur Verfügung. Es gibt Funktionen zur direkten Umrechnung zwischen zwei bestimmten Stellenwert-Systemen.
base_convert
Außerdem bietet die Funktion base_convert() die Möglichkeit der Umrechnung zwischen zwei beliebigen Stellenwert-Systemen im Bereich von 2 bis 36. Die Begrenzung 36 existiert deshalb, weil zur Darstellung der Ziffern und Zeichen nur die Ziffern 0 bis 9 und die 26 Buchstaben verwendet werden.
Listing I.7 Datei ui07.php
<html>
<body>
<?php
echo "<b>Zahlen-Systeme:</b><br>";
$e = 57;
echo "Variable e: $e (als Dezimalzahl)<br>";
echo "als Binärzahl (Zahl zur Basis 2): " .
decbin($e) . "<br>";
echo "als Oktalzahl (Zahl zur Basis 8): " .
decoct($e) . "<br>";
echo "als Hexadezimalzahl (Zahl zur Basis 16): " .
dechex($e) . "<br>";
echo "als Zahl zur Basis 4: " .
base_convert($e,10,4) . "<br>";
echo "als Zahl zur Basis 32: " .
base_convert($e,10,30) . "<br>";
?>
</body>
</html>
Die Bildschirmausgabe hat folgendes Aussehen:
Abbildung I.7 Stellenwert-Systeme
|
Übung UI08
Erstellen Sie eine HTML-Tabelle. Darin soll das Ergebnis der nachfolgend beschriebenen Berechnungen stehen. Für jeden Wert x von 5 bis 85 in Schritten von 5 (also die Werte x = 5, x = 10, x = 15, x = 20 .... x = 75, x = 80, x = 85) sollen die folgenden Funktionen berechnet werden (Datei ui08.php):
|
Umrechnung des Wertes x in Bogenmaß |
|
Sinus, Cosinus und Tangens des Bogenmaß-Wertes |
|
Wurzel(x), Quadrat von x |
|
Natürlicher Logarithmus von x, 10er-Logarithmus von x |
|
e hoch (x/10) |
|
x als Binärzahl und als Hexadezimalzahl |
Die Ergebnisse sollen jeweils mit drei Nachkommastellen in deutscher Schreibweise mit Tausender-Zeichen formatiert ausgegeben werden, jedoch mit Ausnahme von: Wert x, Quadrat von x, Binärzahl und Hexadezimalzahl. Diese sollen unformatiert ausgegeben werden.
Ein Tipp zur Durchführung: Schreiben Sie dieses umfangreiche Programm in mehreren Schritten. Lassen Sie zunächst die HTML-Tabelle mit einer einzigen Spalte (Wert x) anzeigen. Nachdem Sie diese Aufgabe erfolgreich bewältigt haben, erweitern Sie die Tabelle nach und nach um die weiteren Spalten. So lassen sich evtl. auftretende Fehler leichter finden.
Das Ergebnis sollte folgendes Aussehen haben:
Abbildung I.8 Tabelle mit Berechnungen aus mathematischen Funktionen
|
Übung UI09
Es soll das Ergebnis einer Geldanlage berechnet werden. Stellen Sie dem Benutzer ein Formular zur Verfügung (Datei ui09.htm), in dem er einen Anlagebetrag A, eine Laufzeit in Jahren L und einen Zinssatz in Prozent Z eintragen kann. Nach dem Eintragen der Werte kann er das Formular absenden, und ihm wird der Endbetrag genannt (Datei ui09.php). Dieser berechnet sich über die folgende Formel:
Endbetrag = A mal ((1 + Z/100) hoch L)
Zur Kontrolle: Ein Betrag von 1000 DM, angelegt über 2 Jahre bei einem Zinssatz von 5%, ergibt einen Endbetrag von 1102,50 DM.
Das Formular sollte wie folgt aussehen:
Abbildung I.9 Eingabe der Daten für die Geldanlage
|
Der Webserver berechnet und liefert das folgende Ergebnis:
Abbildung I.10 Ergebnis für die Geldanlage
|
I.8 Alle mathematischen Funktionen
Alle Funktionen
Im vorliegenden Abschnitt werden eine ganze Reihe von mathematischen Funktionen in PHP eingesetzt. Zur besseren Übersicht eine Liste aller Funktionen mit einer kurzen Erläuterung. Weitergehende Ausführungen finden sich im PHP-Manual.
Funktion |
Erläuterung |
abs() |
Betrag |
acos() |
Arcus Cosinus |
asin() |
Arcus Sinus |
atan() |
Arcus Tangens |
atan2() |
Arcus Tangens von zwei Variablen |
base_convert() |
Konvertierung zwischen verschiedenen Stellenwertsystemen |
bindec() |
Konvertierung von Binär in Dezimal |
ceil() |
Aufrunden |
cos() |
Cosinus |
decbin() |
Konvertierung von Dezimal in Binär |
dechex() |
Konvertierung von Dezimal in Hexadezimal |
decoct() |
Konvertierung von Dezimal in Oktal |
exp() |
e hoch |
floor() |
Abrunden |
getrandmax() |
größte »einfache« Zufallszahl |
hexdec() |
Konvertierung von Hexadezimal in Dezimal |
log() |
natürlicher Logarithmus |
log10() |
10er-Logarithmus |
max() |
Maximum |
min() |
Minimum |
mt_rand() |
ermittelt eine »bessere« Zufallszahl |
mt_srand() |
initialisiert den »besseren« Zufallszahlen-Generator |
mt_getrandmax() |
größte »bessere« Zufallszahl |
number_format() |
Zahlen-Formatierung mit Tausenderzeichen und Dezimalstellen |
octdec() |
Konvertierung von Oktal in Dezimal |
pi() |
mathematische Konstante pi |
pow() |
“Hoch-Rechnung«, Basis hoch Exponent |
rand() |
ermittelt eine »einfache« Zufallszahl |
round() |
Runden |
sin() |
Sinus |
sqrt() |
Wurzel |
srand() |
initialisiert den »einfachen« Zufallszahlen-Generator |
tan() |
Tangens |
|