Dlaczego niektóre języki zaokrąglają do najbliższej NAWET liczby całkowitej?

44

Języki programowania, takie jak Scheme (R5RS) i Python ( patrz to pytanie ), idą w kierunku najbliższej parzystej liczby całkowitej, gdy wartość jest dokładnie pomiędzy otaczającymi liczbami całkowitymi.

Jakie jest tego uzasadnienie?
Czy istnieje pomysł matematyczny, który ułatwia uzasadnienie następujących obliczeń?

(R5RS odwołuje się do standardu zmiennoprzecinkowego IEEE jako źródła tego zachowania).

Profpatsch
źródło
4
Czy czytałeś floating-point-gui.de ?
Basile Starynkevitch
1
IEEE umożliwia tryb wielokrotnego zaokrąglania. To jest jeden z nich. Niektóre języki pozwalają nawet na zmianę trybu zaokrąglania podczas wykonywania.
Tobias Brandt,
5
Możesz przeczytać sekcję Łamanie krawatów w celu zaokrąglenia na Wikipedii i uzasadnienie stowarzyszenia stojące za każdym z nich.
1
„chociaż dokładne to kwestia dyskusji z liczbami zmiennoprzecinkowymi” To nie jest kwestia dyskusji, jest określona bardzo precyzyjnie. Na przykład liczby, które są tutaj istotne (jak 42.5), mogą być dokładnie reprezentowane, ponieważ są ułamkami binarnymi. To, czego nie można dokładnie przedstawić, to ułamki inne niż binarne, w tym ułamki dziesiętne.
svick,

Odpowiedzi:

39

Jakiś czas temu zbudowałem program testowy do sukcesywnego zaokrąglania, ponieważ jest to w zasadzie najgorszy test warunków skrajnych dla algorytmu zaokrąglania.

Dla każdej liczby od 0 do 9 999 zaokrągla najpierw do najbliższej 10, następnie do najbliższej 100, a następnie do najbliższej 1000. (Można również pomyśleć o tym, że 10 000 punktów w [0,1) jest zaokrąglanych do 3 miejsc, a następnie do 2, a następnie do 1.) Ten zestaw liczb ma średnią wartość 4999,5.

Jeśli wszystkie trzy zaokrąglenia są wykonywane przy użyciu metody „zaokrąglanie do połowy w górę”, wyniki są następujące (pierwsza kolumna to wynik zaokrąglania, druga kolumna to liczba liczb zaokrąglona do tego wyniku - tzn. Jest to histogram).

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

Wynik różni się od pojedynczej „zaokrąglonej połowy w górę” do najbliższego tysiąca 550 razy na 10 000, a średnia zaokrąglona wartość wynosi 5055 (więcej niż pierwotna średnia o 55,5).

Jeśli wszystkie trzy zaokrąglenia są wykonywane przez „zaokrąglenie do połowy w dół”, wówczas wyniki są następujące:

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

Wynik różni się od pojedynczej „zaokrąglonej połowy w dół” do najbliższego tysiąca 550 razy na 10 000, a średnia zaokrąglona wartość wynosi 4944 (zbyt niska o 55,5).

Jeśli wszystkie trzy zaokrąglenia zostaną wykonane przy użyciu „nieparzystej połowy rundy”, wynik jest następujący:

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

Wynik różni się od pojedynczego „nieparzystego półokrągłego” do najbliższego tysiąca 550 razy na 10 000, a średnia zaokrąglona wartość to 4999,5 (poprawnie).

Wreszcie, jeśli wszystkie trzy zaokrąglenia zostaną wykonane przy użyciu „zaokrąglenia do połowy”, wyniki są następujące:

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

Wynik różni się od pojedynczego „zaokrąglonego pół parzystego” do najbliższego tysiąca 450 razy na 10 000, a średnia zaokrąglona wartość to 4999,5 (poprawnie).

Wydaje mi się, że oczywiste jest, że zaokrąglanie do połowy i zaokrąglanie do dołu odchyla zaokrąglone wartości, tak że średnia zaokrąglonych wartości nie ma już takich samych oczekiwań jak średnia z wartości pierwotnych oraz że „nieparzysta zaokrąglona połowa” i „nieparzysta zaokrąglona połowa” „usuń błąd, traktując 5 w jedną stronę w połowie czasu, a w drugą stronę w drugiej połowie. Kolejne zaokrąglanie zwielokrotnia odchylenie.

Okrągły parzysty parzysty i okrągły nieparzysty wprowadzają swój własny rodzaj odchylenia w rozkładzie: odchylenie odpowiednio do liczb parzystych i nieparzystych. W obu przypadkach, to uprzedzenie jest zwielokrotniane przez kolejne zaokrąglanie, ale jest gorsze dla nieparzystej połowy rundy. Myślę, że wyjaśnienie w tym przypadku jest proste: 5 jest liczbą nieparzystą, więc nieparzysta zaokrąglona połowa ma więcej wyników kończących się na 5 niż parzysta zaokrąglona - a zatem więcej wyników, które będą musiały być obsługiwane specjalnie przy następnym zaokrąglaniu.

Tak czy inaczej, spośród czterech opcji tylko dwie są obiektywne, a spośród dwóch niezależnych opcji, okrągła połowa daje nawet najlepiej zachowujący się rozkład, gdy podlega wielokrotnemu zaokrąglaniu.

Hobbs
źródło
55

To się nazywa zaokrąglanie przez bankiera. Chodzi o to, aby zminimalizować błąd skumulowany z wielu operacji zaokrąglania.

Powiedzmy, że zawsze zaokrąglałeś .5 w dół. Pomyśl o tych wszystkich małych wypłatach odsetek, bank za każdym razem wpłaca pół centa ...

Powiedzmy, że zawsze zaokrąglałeś .5 w górę. Rachunkowość będzie krzyczeć, ponieważ płacisz więcej odsetek, niż powinieneś.

Loren Pechtel
źródło
6
ale dlaczego parzyste i nie dziwne?
grzechotka maniaczka
17
@ratchetfreak - tak małe liczby zaokrąglają do, a nie od zera. Poza tym jest to arbitralne - musi być czymś.
Jonathan Dursi
15
@ratchetfreak: Co by się stało, gdybyś zaczął od liczby 1, podzielił przez 2 i zaokrąglił do liczby nieparzystej? Zaokrąglasz 0,5 do 1. Co zrobić, jeśli ponownie podzielisz przez 2? Zaokrąglasz 0,5 do 1. I tak dalej. Nigdy nie staje się zerem.
gnasher729,
13
Myślę, że liczby parzyste powinny być również preferowane w stosunku do liczb nieparzystych, ponieważ zmniejszają one prawdopodobieństwo konieczności późniejszych dylematów zaokrąglania. Dzielenie według (dokładnie) dwóch jest dość częstą operacją w praktyce.
Marc van Leeuwen,
4
Jest to również ważne w statystykach. Jeśli każdy ułamkowy element zestawu danych zostanie zaokrąglony w górę, statystyki opisowe, takie jak średnia, będą (nieznacznie) wyższe niż w przypadku zaokrąglenia w dół. Wprowadzenie do epidemiologii Kennetha Rothmana wspomina w szczególności, że zawsze zaokrągla terminal .5 (lub .005 lub cokolwiek innego) w górę, jako że stopniowo przesuwa bazę danych w kierunku wyższych liczb, ale zawsze zaokrąglanie do liczby parzystej lub nieparzystej nie powoduje odchylenia od średniej.
Will Murphy,