it-swarm.com.de

Warum runden einige Sprachen auf die nächste EVEN-Ganzzahl?

Programmiersprachen wie Scheme (R5RS) und Python ( siehe diese Frage )) runden auf die nächste gerade Ganzzahl, wenn der Wert genau zwischen den umgebenden Ganzzahlen liegt.

Was ist der Grund dafür?
Gibt es eine mathematische Idee, die es einfacher macht, über folgende Berechnungen nachzudenken?

(R5RS verweist auf den IEEE-Gleitkomma-Standard als Quelle für dieses Verhalten.)

46
Profpatsch

Vor einiger Zeit habe ich ein Testprogramm für sukzessive Rundungen erstellt, da es sich im Grunde genommen um einen Stresstest im schlimmsten Fall für einen Rundungsalgorithmus handelt.

Für jede Zahl von 0 bis 9.999 wird zuerst auf die nächsten 10, dann auf die nächsten 100 und dann auf die nächsten 1000 gerundet. (Sie können sich das auch als 10.000 Punkte in [0,1 vorstellen), die dann auf 3 Stellen gerundet werden bis 2, dann bis 1.) Dieser Satz von Zahlen hat einen Mittelwert von 4999,5.

Wenn alle drei Rundungen mit der Methode "Aufrunden der Hälfte" durchgeführt werden, sind die Ergebnisse wie folgt (erste Spalte ist das Rundungsergebnis, zweite Spalte ist wie viele Zahlen, die auf dieses Ergebnis gerundet sind - dh es ist ein Histogramm).

0     445
1000  1000
2000  1000
3000  1000
4000  1000
5000  1000
6000  1000
7000  1000
8000  1000
9000  1000
10000 555

Das Ergebnis unterscheidet sich von einer einzelnen "Aufrundung" auf die nächsten tausend 550-mal von 10.000 und der durchschnittliche gerundete Wert beträgt 5055 (um 55,5 höher als der ursprüngliche Durchschnitt).

Wenn alle drei Rundungen durch "Abrunden der Hälfte" erfolgen, sind die Ergebnisse:

0     556
1000  1000
2000  1000
3000  1000
4000  1000
5000  1000
6000  1000
7000  1000
8000  1000
9000  1000
10000 444

Das Ergebnis unterscheidet sich von einer einzelnen "Abrundung zur Hälfte" auf die nächsten tausend 550-mal von 10.000, und der durchschnittliche gerundete Wert beträgt 4944 (um 55,5 zu niedrig).

Wenn alle drei Rundungen mit "runde halbe ungerade" durchgeführt werden, lautet das Ergebnis:

0     445
1000  1111
2000  889
3000  1111
4000  889
5000  1111
6000  889
7000  1111
8000  889
9000  1111
10000 444

Das Ergebnis unterscheidet sich von einer einzelnen "runden halben ungeraden" bis zur nächsten tausend 550-mal von 10.000 und der durchschnittliche gerundete Wert beträgt 4999,5 (korrekt).

Wenn alle drei Rundungen mit "runder halber Gerade" durchgeführt werden, sind die Ergebnisse:

0     546
1000  909
2000  1091
3000  909
4000  1091
5000  909
6000  1091
7000  909
8000  1091
9000  909
10000 1091

Das Ergebnis unterscheidet sich von einer einzelnen "runden halben Geraden" bis zur nächsten Tausend 45 mal von 10.000 und der durchschnittliche gerundete Wert beträgt 4999,5 (korrekt).

Ich denke, es ist offensichtlich, dass die Hälfte der Auf- und Abrundung die gerundeten Werte verzerrt, so dass der Durchschnitt der gerundeten Werte nicht mehr die gleiche Erwartung hat wie der Durchschnitt der ursprünglichen Werte, und dass "die Hälfte gerade gerade" und "die Hälfte ungerade" "Entfernen Sie die Vorspannung, indem Sie 5 die eine Hälfte der Zeit und die andere Hälfte behandeln. Aufeinanderfolgende Rundungen multiplizieren die Vorspannung.

Runde halb gerade und runde Hälfte ungerade führen ihre eigene Art von Verzerrung in die Verteilung ein: eine Tendenz zu geraden bzw. ungeraden Ziffern. In beiden Fällen wird diese Verzerrung wiederum durch aufeinanderfolgende Rundungen multipliziert, aber es ist schlimmer für die halbe ungerade Runde. Ich denke, dass die Erklärung in diesem Fall einfach ist: 5 ist eine ungerade Zahl, also hat die runde Hälfte ungerade mehr Ergebnisse, die mit 5 enden als die runde Hälfte gerade - und daher mehr Ergebnisse, die speziell von behandelt werden müssen. weiter Rundung.

Von den vier Auswahlmöglichkeiten sind also nur zwei unvoreingenommen, und von den beiden unvoreingenommenen Auswahlmöglichkeiten ergibt die runde Hälfte sogar die Verteilung mit dem besten Verhalten, wenn sie wiederholt gerundet wird.

39
hobbs

Es heißt Bankrundung. Die Idee ist, den kumulativen Fehler aus vielen Rundungsoperationen zu minimieren.

Nehmen wir an, Sie haben immer .5 abgerundet. Denken Sie an all diese kleinen Zinszahlungen, bei denen die Bank jedes Mal einen halben Cent einsteckt ...

Nehmen wir an, Sie haben immer .5 aufgerundet. Das Rechnungswesen wird schreien, weil Sie mehr Zinsen zahlen, als Sie sollten.

55
Loren Pechtel