SELFHTML: Perl / Perl-Sprachelemente / Zahlen
Author: Redaktion SELFHTML, selfhtml81@selfhtml.org
Description: Welche Besonderheiten es bei Zeichenketten in Perl zu beachten gibt.
Keywords: SELFHTML, Perl, Zahlen, hexadezimale Notation, oklate Notation, große Zahlen, Math-Modul
Date: 2005-11-09T00:29:27+01:00

| # Zahlen
| Eigenschaften von Zahlen in Perl Schreibweisen von Zahlen Operationen und Funktionen für Zahlen

## 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 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/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";

### Erläuterung:

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.

### 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);
    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";

### Erläuterung:

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.

## 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`.

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

| Bedingte Anweisungen
| Zeichenketten (Strings)

© 2007 Impressum