Thread Rechenfehler mit Perl ausgleichen (71 answers)
Opened by bianca at 2013-04-27 13:42

tonewheel
 2013-04-27 20:21
#167317 #167317
User since
2006-10-01
182 articles
BenutzerIn
[default_avatar]
Ich nehme nun an, dass diese 'Summen', die Du erwähnst, Integerzahlen sein sollen?!

Antwort für Integer: Hast Du mal die modifizierte Zeile 8 ausprobiert? Liefert die nicht genau das, was Du willst? Sie ist ausreichend, um den 'Rundungsfehler' von Perl zu verhindern.

Antwort für Float: Da Float Werte nie 'gleich' sind (das liegt nicht an Perl, oder am Computer, sondern einfach nur daran, dass man mit endlich vielen Binärstellen keine reelle Zahl darstellen kann), legt man fest, wann etwas 'als gleich gelten soll'. Dann tut man, ähnlich der Mathematik; man legt ein epsilon fest, das die Abweichung anzeigt, die noch als gleich gilt:

Code (perl): (dl )
1
2
3
4
5
6
7
8
my $epsilon = 0.00000001;
my $a = ....; # irgendein errechneter float wert
my $b = ....; # noch irgendein errechneter float wert

if (abs($a - $b) < $epsilon)
   # In dem Fall 'sieht man es als 0 an'
else
   my $differenz = $a - $b;


Deine Integer sub schafft ggf. nur noch mehr Durcheinander. Denn ich bin mir nicht mal sicher, ob beim cast von float zu string und dann wieder zu float die Zahl intern wirklich so abgespeichert ist, wie vorher. Kann das aber nicht beweisen.

View full thread Rechenfehler mit Perl ausgleichen