Mengapa beberapa bahasa membulatkan ke integer EVEN terdekat?


44

Bahasa pemrograman seperti Skema (R5RS) dan Python ( lihat Pertanyaan ini ) berputar menuju bilangan bulat genap terdekat saat nilainya tepat di antara bilangan bulat di sekitarnya.

Apa alasan di balik ini?
Apakah ada ide matematika yang membuat perhitungan berikut lebih mudah untuk dipikirkan?

(R5RS merujuk standar titik mengambang IEEE sebagai sumber perilaku ini.)


4
Apakah Anda membaca floating-point-gui.de ?
Basile Starynkevitch

1
IEEE memungkinkan beberapa mode pembulatan. Ini salah satunya. Beberapa bahasa bahkan memungkinkan mengubah mode pembulatan selama eksekusi.
Tobias Brandt

5
Anda mungkin ingin membaca Tie-melanggar bagian untuk pembulatan di Wikipedia dan alasan asosiasi belakang masing-masing dari mereka.


1
"Meskipun tepat adalah masalah diskusi dengan angka floating point" Ini bukan masalah diskusi, itu ditentukan dengan sangat tepat. Sebagai contoh, angka-angka yang relevan di sini (seperti 42.5) dapat direpresentasikan dengan tepat, karena mereka adalah pecahan biner. Yang tidak bisa direpresentasikan secara pasti adalah pecahan selain biner, termasuk pecahan desimal.
svick

Jawaban:


39

Beberapa waktu yang lalu saya membuat program uji untuk pembulatan berturut-turut, karena pada dasarnya ini merupakan uji stres terburuk untuk algoritma pembulatan.

Untuk setiap angka dari 0 hingga 9.999, putaran pertama ke 10 terdekat, kemudian ke 100 terdekat, lalu ke 1000 terdekat. (Anda juga bisa menganggap ini sebagai 10.000 poin dalam [0,1) dibulatkan menjadi 3 tempat, lalu ke 2, lalu ke 1.) Kumpulan angka ini memiliki nilai rata-rata 4.999,5.

Jika ketiga pembulatan dilakukan dengan menggunakan metode "pembulatan setengah ke atas", maka hasilnya adalah sebagai berikut (kolom pertama adalah hasil pembulatan, kolom kedua adalah berapa banyak angka yang dibulatkan ke hasil itu - yaitu itu adalah histogram).

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

Hasilnya berbeda dari satu "putaran setengah ke atas" ke seribu terdekat 550 kali dari 10.000 dan nilai rata-rata bulat adalah 5055 (lebih tinggi dari rata-rata aslinya sebesar 55,5).

Jika ketiga pembulatan dilakukan dengan "pembulatan setengah ke bawah", maka hasilnya adalah:

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

Hasilnya berbeda dari satu "putaran setengah ke bawah" ke seribu terdekat 550 kali dari 10.000 dan nilai rata-rata bulat adalah 4.944 (terlalu rendah dengan 55.5).

Jika ketiga pembulatan dilakukan menggunakan "round half odd", hasilnya adalah:

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

Hasilnya berbeda dari satu "putaran setengah ganjil" ke seribu terdekat 550 kali dari 10.000 dan nilai bulat rata-rata adalah 4.999,5 (benar).

Akhirnya, jika ketiga pembulatan dilakukan menggunakan "round half even", hasilnya adalah:

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

Hasil berbeda dari single "putaran setengah bahkan" ke terdekat ribu 450 kali dari 10.000 dan rata-rata nilai bulat adalah 4999,5 (yang benar).

Saya pikir itu jelas bahwa setengah setengah atas dan ke bawah setengah bias nilai bulat, sehingga rata-rata nilai bulat tidak lagi memiliki harapan yang sama dengan rata-rata nilai asli, dan bahwa "setengah setengah genap" dan "setengah setengah ganjil" msgstr "hapus bias dengan memperlakukan 5 setengah jalan waktu dan separuh lainnya setengah jalan. Pembulatan berturut-turut menggandakan bias.

Babak setengah genap dan setengah setengah ganjil memperkenalkan jenis bias mereka sendiri untuk distribusi: masing-masing bias terhadap angka genap dan ganjil. Dalam kedua kasus, sekali lagi, bias ini dikalikan dengan pembulatan berturut-turut, tetapi lebih buruk untuk putaran setengah aneh. Saya pikir penjelasan dalam kasus ini sederhana: 5 adalah angka ganjil, jadi setengah babak ganjil memiliki hasil lebih banyak yang berakhir pada 5 dari pada setengahnya genap - dan oleh karena itu, lebih banyak hasil yang harus ditangani secara khusus oleh putaran berikutnya .

Jadi bagaimanapun, dari empat pilihan, hanya dua yang tidak bias, dan dari dua pilihan yang tidak bias, setengah babak bahkan memberikan distribusi berperilaku terbaik ketika dikenakan pembulatan berulang.


55

Ini disebut pembulatan bankir. Idenya adalah untuk meminimalkan kesalahan kumulatif dari banyak operasi pembulatan.

Katakanlah Anda selalu dibulatkan 0,5 ke bawah. Pikirkan semua pembayaran bunga kecil itu, bank mengantongi setengah sen setiap kali ...

Katakanlah Anda selalu dibulatkan 0,5 ke atas. Akuntansi akan menjerit karena Anda membayar bunga lebih dari yang seharusnya.


6
tapi mengapa genap dan tidak aneh?
ratchet freak

17
@ scratchetfreak - angka sangat kecil membulatkan ke, tidak jauh dari, nol. Selain itu, itu sewenang-wenang - harus menjadi sesuatu.
Jonathan Dursi

15
@ scratchetfreak: Apa yang akan terjadi jika Anda mulai dengan angka 1, bagi dengan 2, dan bulat menjadi aneh? Anda mendapatkan 0,5 dibulatkan menjadi 1. Bagaimana jika Anda membaginya dengan 2 lagi? Anda mendapatkan 0,5 dibulatkan menjadi 1. Dan seterusnya. Tidak pernah menjadi nol.
gnasher729

13
Saya pikir angka genap juga lebih disukai daripada angka ganjil karena angka tersebut menurunkan probabilitas untuk kebutuhan dilema pembulatan berikutnya . Pembagian oleh (tepatnya) dua menjadi operasi yang agak sering dalam praktek.
Marc van Leeuwen

4
Ini juga penting dalam statistik. Jika setiap anggota fraksional dari kumpulan data dibulatkan, statistik deskriptif seperti rata-rata akan (sedikit) lebih tinggi daripada jika dibulatkan. Pengantar Epidemiologi Kenneth Rothman secara khusus menyebutkan selalu membulatkan terminal 0,5 (atau 0,005, atau apa pun) sebagai biasing database secara bertahap menuju angka yang lebih tinggi, tetapi selalu membulatkan ke angka genap atau ganjil tidak bias rata-rata.
Will Murphy
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.