Perl/Zahlen

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

[Bearbeiten] Eigenschaften von Zahlen in Perl

Perl operiert bei Einsatz von 32-Bit-Prozessoren, wie sie heute bei den meisten Computern (noch) ü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:

Beispiel
#!/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 gegenü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 kleine 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('12345678901234567890');
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 Beispiel-Script 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 zum 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 bei komplexeren Rechenoperationen beanspruchen die so erzeugten Zahlen deutlich mehr Rechenleistung.

[Bearbeiten] Schreibweisen von Zahlen

Gewöhnliche Zahlen können Sie in Perl auch wie gewohnt notieren. Zu beachten ist nur, 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.

Notationsbeispiel Erläuterung
243 Normale Notation einer Ganzzahl im Dezimalformat.
-243 Notation einer negativen Ganzzahl im Dezimalformat.
+243 Notation einer explizit positiven Ganzzahl im Dezimalformat.
53.78 Notation einer "Kommazahl". Dezimalzeichen ist der Punkt. Minus- und Pluszeichen sind genauso möglich wie bei Ganzzahlen.
1.0e+4 Notation einer großen Zahl in Exponentialschreibweise. Die Zahl im Beispiel bedeutet so viel wie 10000. Die 4 am Ende gibt also die Anzahl der Zehnerpotenzen an.
1.0e-4 Notation einer kleinen Zahl in Exponentialschreibweise. Die Zahl bedeutet so viel wie 0.0001.
0700 Notation einer Ganzzahl in Oktalschreibweise. Dabei wird einfach eine 0 vorangestellt. Die Zahl bedeutet dezimal so viel wie 448.
0xF6 Notation einer Ganzzahl in Hexadezimalschreibweise. Dabei wird einfach die Zeichenfolge 0x vorangestellt. Die Zahl bedeutet dezimal so viel wie 246.

[Bearbeiten] Operationen und Funktionen für Zahlen

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 trigonometrische 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).

Meine Werkzeuge
Namensräume

Varianten
Aktionen
Übersicht
Index
Mitmachen
Werkzeuge
Spenden
SELFHTML