SELFHTML/Navigationshilfen CGI/Perl Perl-Sprachelemente |
Zahlen | |
Eigenschaften von Zahlen in Perl |
|
Perl operiert bei Einsatz von 32-Bit-Prozessoren, wie sie heute bei den meisten Computern üblich sind, intern mit 32 Bit breiten Gleitpunktzahlen nach dem Standard IEEE754. Das bedeutet für die Praxis, dass Perl bei sehr großen Zahlen und sehr kleinen Zahlen tendenziell immer "undeutlicher" wird in der Darstellung. Bei solchen Zahlen wendet Perl zur Darstellung die Exponentialschreibweise an. Je größer bzw. kleiner die Zahlen jedoch werden, desto ungenauer ist die Darstellung. Das folgende Beispiel zeigt dies:
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); print "Content-type: text/plain\n\n"; my $x = 12345678901234567890; my $y = 0.000000000000000001; print "x = $x\n"; print "y = $y\n"; $x = $x + 1; $y = $y - 0.123456789123456789; print "x = $x\n"; print "y = $y\n"; |
Das Beispiel zwingt zwei Skalaren $x
und $y
jeweils eine ziemlich große und eine ziemlich kleine Zahl auf. Anschließend werden die Zahlen als reiner Text ausgegeben. Dann werden die beiden Skalare noch weiter traktiert. $x
soll nur eine einzige Zahl dazuzählen, und bei $y
soll eine ziemlich vielstellige Gleitpunktzahl subtrahiert werden. Nach diesen Operationen werden beide Skalare nochmals ausgegeben. Perl erzeugt folgende Ausgabe:
x = 1.23456789012346e+019
y = 1e-018
x = 1.23456789012346e+019
y = -0.123456789123457
Die große Zahl von $x
hat sich bei der zweiten Ausgabe gebenüber der ersten Ausgabe also trotz der Addition von 1 nicht verändert, und bei dem Wert von $y
ist offensichtlich, dass bei der zweiten Ausgabe ein paar Stellen hinter dem Komma dran glauben mussten.
Es gibt jedoch das Standardmodul Math
, das Perl befähigt, potentiell beliebig große und kleinen Zahlen darzustellen und damit zu rechnen.
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); use Math::BigInt; use Math::BigFloat; my $x = Math::BigInt->new('1234567890 1234567890'); my $y = Math::BigFloat->new('0.000000000000000001'); print "Content-type: text/plain\n\n"; print "x = $x\n"; print "y = $y\n"; $x = $x + 1; $y = $y - 0.123456789123456789; print "x = $x\n"; print "y = $y\n"; |
Das Beispielscript führt die gleichen Zahlen und Operationen ein wie zuvor, aber diesmal bindet es zwei Untermodule von Math
ein:
Mit use Math::BigInt;
wird ein Modul zum Darstellen von und Rechnen mit großen Ganzzahlen eingebunden.
Mit use Math::BigFloat;
wird ein Modul zum Darstellen von und Rechnen mit großen Gleitpunktzahlen eingebunden.
Um eine Zahl mit diesen Modulen zu erzeugen, gehen Sie vor wie gezeigt: bei Ganzzahlen notieren Sie Math::BigInt->new('[Zahl]')
, und bei Gleitpunktzahlen Math::BigFloat->new('[Zahl]')
.
Zur besseren Übersicht dürfen Sie in die Zahl auch Leerzeichen einfügen, wie im ersten der obigen Beispiele gezeigt. Anschließend können Sie mit den Skalaren, denen Sie solche Zahlen zugewiesen haben, ganz normal arbeiten. Sie können die Werte ausgeben und verändern, so wie im Beispiel. Das Beispiel erzeugt nun folgende Ausgabe:
x = +12345678901234567890
y = .000000000000000001
x = +12345678901234567891
y = -.123456789123456999
Benutzen Sie diese Module jedoch nur bei solchen großen Zahlen. Denn die bei komplexeren Rechenoperationen beanspruchen die so erzeugten Zahlen deutlich mehr Rechenleistung, da sie intern in Zeichenketten umgewandelt werden.
Gewöhnliche Zahlen können Sie in Perl auch wie gewohnt notieren. Wichtig ist nur zu beachten, dass das Dezimalzeichen bei "Kommazahlen" der Punkt ist. Negative Zahlen können Sie notieren, indem Sie ein Minuszeichen voranstellen. Bei positiven Zahlen können Sie auch ein explizites Pluszeichen voranstellen. Neben der gewöhnlichen Notation im Dezimalformat können Sie Zahlen aber auch in Exponentialschreibweise, oktal oder hexadezimal notieren. Die folgende Tabelle bietet eine Übersicht der Notationsmöglichkeiten.
|
Zahlen sind hauptsächlich zum Rechnen da. Perl unterstützt die Grundrechenarten. Zuständig dafür sind die Berechnungsoperatoren. Mit ihrer Hilfe und beliebiger Klammerung lassen sich z.B. Ausdrücke wie (5*(6+8.00003))-7
ohne weiteren Umweg berechnen.
Daneben bietet Perl auch eine Reihe mathematischer Funktionen an. Darunter befinden sich allgemeine Funktionen wie sqrt (Quadratwurzel errechnen), aber auch trigonomische Funktionen wie sin (Sinus), cos (Cosinus) und atan2 (Arcus Tangens y/x), sowie Umrechnungsfunktionen wie hex (Hexadezimalzahlen in Dezimalzahlen umrechnen) oder oct (Oktalzahlen in Dezimalzahlen umrechnen).
Bedingte Anweisungen | |
Zeichenketten (Strings) | |
SELFHTML/Navigationshilfen CGI/Perl Perl-Sprachelemente |
© 2001 selfhtml@teamone.de