Neden bazı diller en yakın EVEN tamsayısına yuvarlanıyor?


44

Scheme (R5RS) ve Python ( bu soruya bakınız ) gibi programlama dilleri , değer tam olarak çevresindeki tamsayılar arasında olduğunda en yakın eşit sayıya doğru ilerler.

Bunun arkasındaki sebep nedir?
Aşağıdaki hesaplamaları aklınıza gelmesi kolaylaştıran matematiksel bir fikir var mı?

(R5RS, IEEE kayan nokta standardına bu davranışın kaynağı olarak atıfta bulunur.)



1
IEEE çoklu yuvarlama moduna izin verir. Bu onlardan biri. Bazı diller yürütme sırasında yuvarlama modunu bile değiştirebilir.
Tobias Brandt

5
Vikipedi'de yuvarlama için Kravat kırma bölümünü ve bunların her birinin arkasındaki mantığı okumak isteyebilirsiniz .


1
"Kesin, kayan noktalı sayılarla bir tartışma konusu olmasına rağmen" Bu bir tartışma konusu değil, çok kesin bir şekilde belirtilmiş. Örneğin, burada ilgili sayılar (42.5 gibi) tam olarak gösterilebilir, çünkü bunlar ikili kesirlerdir. Tam olarak temsil edilemeyen, ondalık kesirler de dahil olmak üzere ikiliden başka kesirlerdir.
svick

Yanıtlar:


39

Bir süre önce, ardışık yuvarlama için bir test programı hazırladım, çünkü temelde yuvarlama algoritması için en kötü durum stres testi.

0'dan 9,999'a kadar olan her bir sayı için önce en yakın 10'a, sonra en yakın 100'e, sonra en yakın 1000'e yuvarlanır. önce 2, sonra 1 ile).) Bu sayı kümesi ortalama 4999,5 değerine sahiptir.

Her üç kere dolanmak "yuvarlak yarım yukarı" yöntemi kullanılarak yapılır, sonra sonuçları aşağıdaki gibi olan (ilk sütun yuvarlama sonucudur, ikinci sütun nasıl birçok sayılar ilgili sonucun yuvarlanır - bir histogram olduğunu yani).

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

Sonuç, tek bir "yarı yarıya" dan 10.000'in en yakın bin 550 katı kadar ve ortalama yuvarlak değer 5055 (orjinal ortalamanın 55,5'e kadar daha yüksek) arasında değişir.

Her üç yuvarlama da "yarı yarıya aşağı" ile yapılırsa, sonuçlar şöyledir:

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

Sonuç, tek bir "yarı yarıya aşağı" dan 10.000'in en yakın bin 550 katı kadar ve ortalama yuvarlak değer 4944 (55.5 ile çok düşük) arasında değişiyor.

Üç yuvarlama da "yuvarlak yarı tek" kullanılarak yapılırsa, sonuç şöyledir:

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

Sonuç, tek bir "yuvarlak yarı tek" ten 10.000'in en yakın bin 550 katı kadar ve ortalama yuvarlak değer 4999.5 (doğru).

Son olarak, eğer üç yuvarlama da "yarı yuvarlak bile" kullanılarak yapılırsa, sonuçlar şöyledir:

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

Sonuç, tek bir "yuvarlak yarı bile" den 10.000'in en yakın bin 450 katı arasında değişiyor ve ortalama yuvarlak değer 4999.5 (doğru).

Ben yuvarlak yarı yukarı ve yuvarlak yarı aşağı yuvarlak değerleri önyargılı olduğunu, böylece yuvarlak değerlerin ortalamanın artık orijinal değerlerin ortalaması ile aynı beklentiye sahip olmadığını ve "yuvarlak yarı yuvarlak" ve "yarım yarı tekin "Önyargıyı 5'in yarısına, diğer yarısına diğer tarafa davranarak ortadan kaldırın. Ardışık yuvarlama, önyargıyı çarpar.

Yuvarlak yarı çift ve yuvarlak yarı tek başına dağılım, kendilerine özgü önyargıları ortaya koymaktadır: sırasıyla çift ve tek sayılara doğru önyargı. Her iki durumda da, yine, bu önyargı ardışık yuvarlama ile çarpılır, ancak yarı yarı tuhaflık için daha kötüdür. Bu durumdaki açıklamanın basit olduğunu düşünüyorum: 5 tek bir sayıdır, bu nedenle yuvarlak yarı tek, beşinci yarıya eşit sonuçtan daha fazla sonuç verir - ve bu nedenle, sonraki yuvarlama tarafından özel olarak ele alınması gereken daha fazla sonuç vardır .

Her neyse, dört seçenekten sadece ikisi tarafsız ve iki tarafsız seçenekten, yarı yarıya bile tekrarlanan yuvarlamalara maruz kaldığında en iyi davranışlı dağılımı bile veriyor.


55

Buna bankanın yuvarlaması denir. Fikir, birçok yuvarlama işleminden kaynaklanan kümülatif hatayı minimize etmektir.

Diyelim ki her zaman, 0,5 yuvarladığını. Bütün bu küçük faiz ödemelerini düşün, banka her seferinde yarım kuruş para harcıyor ...

Her zaman yuvarladığınızı söyleyelim. Muhasebe çığlık atacak çünkü sizden daha fazla faiz ödüyorsunuz.


6
ama neden hatta ve garip değil?
cırcır ucube

17
@ ratchetfreak - çok küçük sayılar sıfıra değil, uzağa yuvarlanır. Bunun dışında, keyfi - bir şey olmalı.
Jonathan Dursi

15
@ ratchetfreak: 1 sayısı ile başlarsanız, 2'ye bölünür ve garip bir şekilde kalırsanız ne olur? 0'a yuvarlanırsınız. 1'e 2 bölerseniz ne olur? 0'a yuvarlanırsınız. Asla sıfır olmaz.
gnasher729

13
Rakamların bile tek sayılara tercih edileceğini düşünüyorum çünkü sonraki yuvarlama ikilemlerine olan ihtiyaç olasılığını düşürüyorlar. (Tam olarak) ikiye bölme pratikte oldukça sık görülen bir işlemdir.
Marc van Leeuwen

4
İstatistiklerde de önemlidir. Bir veri kümesinin her kesirli üyesi yuvarlanırsa, ortalama gibi açıklayıcı istatistikler, aşağı yuvarlanmaya göre (biraz) daha yüksek olacaktır. Kenneth Rothman'ın Epidemiyolojiye Giriş'i, özellikle bir veritabanını kademeli olarak daha yüksek sayılara yönelttiği için (5, veya .005 veya her neyse) yuvarlak terminalden bahseder;
Murphy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.