Perl: Wie vergleichen Fließkomma-zahlen
Schrieb ich das folgende Perl-Skript. Es wird jedoch nicht gedruckt "1". Ich habe einige der Forschung, und es scheint, dass es ist, weil der IEEE Darstellung Fließkomma-Zahl. Also, gibt es eine bessere Möglichkeit zum Vergleich von floating-point-zahlen in Perl?
for (my $tmp = 0.1; $tmp <= 1; $tmp+=0.05){print $tmp."\n"}
Ausgabe:
0.1
0.15
0.2
0.25
0.3
0.35
0.4
0.45
0.5
0.55
0.6
0.65
0.7
0.75
0.8
0.85
0.9
0.95
$tmp <= 1+$tolerance
- zeigen mehr Präzision zu sehen, was passiert (ändern Sie die limit zu 1)
perl -e 'for (my $tmp = 0.1; $tmp <= 1.01; $tmp+=0.05){printf "%.20f\n", $tmp}'
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alle Berechnungen, die Verwendung von Gleitkommazahlen haben können, Präzision Fehler, und wenn Sie die Wiederverwendung der Ergebnisse, diese Präzision Fehler-stack-up. Eine Sache, zu lernen, dass ist nie ein schweben als ein loop control variable.
Etwas wie
wo immer Sie können. Wenn Sie wirklich, wirklich brauchen, zum vergleichen von zwei floats
($a, $b)
etwas wieist das einzige, das wirklich funktioniert-aber diese haben möglicherweise Probleme, als auch, je nachdem, wie klein der Unterschied sein kann, um zu zählen, als einen echten Unterschied.
Multiplizieren Sie alles, so dass Sie arbeiten nur mit ganzen zahlen - in diesem Fall 100.
Dann beim drucken der Zahl, teilen Sie durch die gleiche Anzahl;
Gibt mir:
Dies ist eine klassische situation, in der Programmierung, und ist gut erklärt hier
Dem Update ist die Verwendung von integer-Arithmetik statt, und schreiben Sie es wie folgt
Ausgabe
Ergebnis: