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

tonewheel
 2013-05-01 23:47
#167390 #167390
User since
2006-10-01
182 articles
BenutzerIn
[default_avatar]
Das ist plausibel, danke. Trotzdem noch eine Anmerkung: das liegt nicht an (s)printf selbst, sondern ist ein Thema, dass sich quer durch die Rechnerwelt hindurch zieht, aufgrund der Tatsache, dass diese Zahlen 'ungünstig' sind, um sie binär aufzulösen. Hier ein Beispiel in JavaScript (nur weil ich testen wollte, ob es da auch so ist, wie schon in C), wobei man (in der 3. Spalte) deutlich sieht, wo das Problem liegt:

Code: (dl )
1
2
3
4
var i;
for(i = 0; i < 1.01; i += 0.05) {
document.writeln(i.toPrecision(2) + " " + i.toPrecision(1) + " " + i.toPrecision(20));
}

Quote
0.0 0 0.0000000000000000000
0.050 0.05 0.050000000000000002776
0.10 0.1 0.10000000000000000555
0.15 0.2 0.15000000000000002220
0.20 0.2 0.20000000000000001110
0.25 0.3 0.25000000000000000000
0.30 0.3 0.29999999999999998890
0.35 0.3 0.34999999999999997780
0.40 0.4 0.39999999999999996669
0.45 0.4 0.44999999999999995559
0.50 0.5 0.49999999999999994449
0.55 0.5 0.54999999999999993339
0.60 0.6 0.59999999999999997780
0.65 0.7 0.65000000000000002220
0.70 0.7 0.70000000000000006661
0.75 0.8 0.75000000000000011102
0.80 0.8 0.80000000000000015543
0.85 0.9 0.85000000000000019984
0.90 0.9 0.90000000000000024425
0.95 1 0.95000000000000028866
1.0 1 1.0000000000000002220

Die betroffenen Werte sind also 'etwas unter' der Grenze, sodass sie nach Unten, anstatt nach Oben gerundet werden.

View full thread Rechenfehler mit Perl ausgleichen