Wednesday, March 24, 2010

Unendliches Perl...

Heute ging es im Forum von Perl-Community.de um das Finden der "größten" Zahl aus den Ergebnissen einer Datenbankabfrage. Das ganze sollte im Perl-Programm gelöst werden und nicht in der Abfrage (was ja mit "MAX()" sehr einfach gewesen wäre). Grob skizziert:

    while ( hole_zeile_aus_ergebnis ) {
# mach was um groeszte Zahl zu finden
}
print groeszte_zahl


Mein Vorschlag war

    my $max;
while ( @row = $dbh->fetchrow_array ) {
$max = $row[2] if not defined $max or $row[2] > $max; # in $row[2] stecken die Zahlen
}
print $max;


Tina kam dann mit einem Vorschlag

    my $max = "-Infinity";
while ( @row = $dbh->fetchrow_array ) {
$max = $row[2] if $row[2] > $max;
}


Funktioniert wohl auf den meisten Systemen, aber eben nicht auf allen. Ich habe ein Windows mit Perl 5.8.9 und dort liefert das Ergebnis für die Zahlen -10, -20 und -1 nicht "-1" sondern es bleibt "-Infinity".

Warum?

Auf den meisten Systemen kann man "Unendlich" durch "Infinity" darstellen, dort wird auch "-1" ausgegeben. Bei anderen Systemen wird "Unendlich" aber anders dargestellt und hier wird "-Infinity" als String angesehen. Im numerischen Kontext wird daraus "0". Und "0" ist natürlich größer als die negativen Zahlen.

Also Vorsicht, wenn man "Unendlich" in einem Programm verwenden will, das auf allen möglichen Plattformen mit allen möglichen Konfigurationen läuft.

Übrigens...

In Perl 6 wird das einheitlich immer "Inf" bzw. "-Inf" sein.

1 comment:

Struppi said...

Perl 5.10 (AchtivePerl/WinXP) macht es auch ohne zu murren.