1 2 3 4 5 6 7
sub schleifenanzahl ($$$$) { my $multiplikand = ($_[0] - $_[1]) / $_[2]; ($multiplikand = $1) if ($multiplikand =~ /(\d)+\.*(\d)*/); $multiplikand++; $_[3] = $_[3] * $multiplikand; return ($_[3]); } # end sub schleifenanzahl
1 2 3 4
sub schleifenanzahl ($$$$) { my ($von, $bis, $schritt, $count )=@_; return $count * ( int( abs($bis-$von)/$schritt )+1 ); } # end sub schleifenanzahl
2014-02-04T12:54:26 qwe123qwe3. und am wichtigsten : ist das dann tatsächlich auch sattelfest ? intern bekomme ich bei einer glatten Division (aslo ohne Rest) ja doch immer eine Dezimalzahl -- wird die dann immer richtig als Ganzzahl ausgegeben ?
1 2 3 4 5 6 7 8
sub integer { my $wert = shift (@_) || 0; return 'FEHLER' if $wert =~ /e\+?\d+$/; return 0 if $wert =~ /e-\d+$/; $wert = $1 if $wert =~ /^(.*?)\./; $wert = 0 if !$wert or $wert == -0; return $wert; }
2014-02-04T16:22:03 biancaVor einiger Zeit haben wir hier im Forum mal diese Funktion entwickelt als besseren Ersatz für int():
Seit dem gibt es bei mir kein int() mehr im Code.
2014-02-04T19:29:00 RaubtierAls besseren Ersatz von int?! Nein, auf keinen Fall!
2014-02-04T19:29:00 RaubtierDie Funktion tut doch etwas völlig anderes. Mag sein, dass sie damals für deine Testfälle das von dir gewünschte Ergebnis gebracht hat - aber deswegen ist sie KEIN besseres int.
Quote...because machine representations
of floating-point numbers can sometimes produce counterintuitive
results. For example, "int(-6.725/0.025)" produces -268 rather
than the correct -269; that's because it's really more like
-268.99999999999994315658 instead...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#!/usr/bin/perl use strict; use warnings; use 5.010; say "ohne: ".(-6.725/0.025); say "int(): ".int(-6.725/0.025); say "integer(): ".integer(-6.725/0.025); sub integer { my $wert = shift (@_) || 0; return 'FEHLER' if $wert =~ /e\+?\d+$/; return 0 if $wert =~ /e-\d+$/; $wert = $1 if $wert =~ /^(.*?)\./; $wert = 0 if !$wert or $wert == -0; return $wert; }
Quoteohne: -269
int(): -268
integer(): -269
sprintf("%.f", $wert);
int(sprintf("%.15f", $a));
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#!/usr/bin/perl use strict; use warnings; my ($von, $bis, $schritt, $count) = (10, 30, 4, 2); my $ergebnis; for (1..$count) { for (my $i = $von; $i <= $bis; $i+=$schritt) { $ergebnis++; # Hier die Befehle, die in der Schleife ausgeführt werden sollen } } print $ergebnis;
2014-02-04T18:43:49 qwe123qwemitzählen will ich eben nicht. Da es ineinander geschachtelte Schleifen gibt (die Anzahl also multipliziert wird) , hab ich bei Testen schon mal 25000 Durchläufe "geschafft" und das hätte dann ca. 5 Tage gedauert :)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
#!/usr/bin/perl use strict; use warnings; use Time::HiRes qw( gettimeofday tv_interval ); my $t0 = [ gettimeofday ]; my ($von, $bis, $schritt, $count) = (10, 30, 4, 25000); my $schleifendurchlaeufe = schleife($von, $bis, $schritt, $count, 'dryrun!'); print "Anzahl Schleifendurchlaufe: $schleifendurchlaeufe\n"; if ($schleifendurchlaeufe <= 5000) { my $ergebnis = schleife($von, $bis, $schritt, $count); print "Ergebnis: $ergebnis\n"; } else { print "Warnung: Kein Ergebnis ermittelt (zu viele Durchläufe).\n"; } print "Time elapsed: " . (tv_interval( $t0 )) . " seconds\n"; sub schleife { my ($von, $bis, $schritt, $count, $dryrun) = @_; my $durchlauefe; for (1..$count) { for (my $i = $von; $i <= $bis; $i+=$schritt) { if ($dryrun) { $durchlauefe++; } else { # Hier die Befehle, die in der Schleife ausgeführt werden sollen } } } if ($dryrun) { return $durchlauefe; } else { return "Befehle in der Schleife ausgeführt!"; } }
1
2
3
Anzahl Schleifendurchlaufe: 150000
Kein Ergebnis ermittelt (zu viele Durchläufe).
Time elapsed: 0.018097 seconds
1
2
3
Anzahl Schleifendurchlaufe: 1500
Ergebnis: Befehle in der Schleife ausgeführt!
Time elapsed: 0.000971 seconds