Чому деякі мови переходять до найближчого цілого числа EVEN?


44

Мови програмування, як схема (R5RS) та Python ( див. Це запитання ), спрямовуються до найближчого парного цілого числа, коли значення точно знаходиться між навколишніми цілими числами.

Які міркування за цим?
Чи є математична ідея, яка робить наступні обчислення легшими для міркувань?

(R5RS згадує стандарт плаваючої крапки IEEE як джерело такої поведінки.)



1
IEEE дозволяє кілька режимів округлення. Це одна з них. Деякі мови навіть дозволяють змінювати режим округлення під час виконання.
Тобіас Брандт

5
Ви можете ознайомитись із розділом про розрив краватки для округлення у Вікіпедії та обґрунтування асоціацій, що стоять за кожною з них.


1
"хоча точне є питанням обговорення з числами з плаваючою комою" Це не питання обговорення, це визначено дуже точно. Наприклад, числа, які є релевантними тут (наприклад, 42.5), можна точно представити, оскільки вони є двійковими дробами. Що неможливо точно представити, це дроби, крім двійкових, включаючи десяткові дроби.
svick

Відповіді:


39

Деякий час тому я створив тестову програму для послідовного округлення, оскільки це в основному найгірший стрес-тест для алгоритму округлення.

Для кожного числа від 0 до 9999 він спочатку обходить до найближчого 10, потім до найближчого 100, потім до найближчого 1000. (Ви також можете подумати про це, як 10 000 балів у [0,1) округлені до 3-х місць, потім до 2, потім до 1.) Цей набір чисел має середнє значення 4999,5.

Якщо всі три заокруглень виконані з використанням методи «круглий половина вгору», то результати виглядають наступним чином (перший стовпець округлення результату, другий стовпець як багато чисел з округленням до цього результату - тобто це гістограма).

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

Результат відрізняється від однієї "круглої половини" до найближчої тисячі 550 разів з 10 000, а середнє округлене значення - 5055 (вище, ніж початкове середнє на 55,5).

Якщо всі три округлення виконуються "круглою половиною вниз", то результати такі:

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

Результат відрізняється від однієї "круглої половини вниз" до найближчої тисячі 550 разів з 10 000, а середня округлена величина - 4944 (занадто низька на 55,5).

Якщо всі три округлення виконуються за допомогою "круглої половини", результат:

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

Результат відрізняється від одиничної "нечетної круглої половини" до найближчої тисячі 550 разів із 10000, а середнє округлене значення - 4999,5 (правильно).

Нарешті, якщо всі три округлення виконані за допомогою "круглої половини", результати:

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

Результат відрізняється від однієї "круглої половини" до найближчої тисячі 450 разів із 10000, а середнє значення округлення становить 4999,5 (правильно).

Я думаю, що очевидно, що кругла половина вгору і кругла половина вниз зміщує округлені значення, так що середнє значення округлених значень більше не має таких самих очікувань, як середнє значення вихідних значень, і що "кругла половина парних" і "кругла половина непарних "усуньте зміщення, обробляючи 5 в одну сторону половини часу, а в іншу - на другу половину. Послідовне округлення збільшує зміщення.

Круглий напівчастий і напівпарний круглий вводять власний вид упередженості в розподіл: ухил до парних і непарних цифр відповідно. В обох випадках, знову ж таки, цей ухил множиться на послідовне округлення, але це гірше для половинного раунду. Я думаю, що пояснення в цьому випадку просте: 5 - це непарне число, тому половина непарної круглої форми має більше результатів, які закінчуються на 5, ніж половину круглої половини - а отже, більше результатів, які доведеться спеціально обробляти наступним округленням.

Таким чином, з чотирьох варіантів лише два є неупередженими, а з двох неупереджених варіантів кругла половина навіть дає найкращий розподіл, коли піддається повторному округленню.


55

Це називається заокруглення банкіра. Ідея полягає в тому, щоб мінімізувати накопичувальну помилку від багатьох операцій округлення.

Скажімо, ви завжди закруглені .5 вниз. Подумайте про всі ці невеликі відсоткові платежі, кожен раз, коли банк кидає по половині відсотків ...

Скажімо, ви завжди округлені .5 вгору. Бухгалтерський облік буде кричати, тому що ви платите більше відсотків, ніж слід.


6
але чому навіть і не дивно?
храповик урод

17
@ratchetfreak - настільки невеликі цифри круглі до, не віддалених від нуля. Крім цього, це довільно - має бути щось.
Джонатан Дурсі

15
@ratchetfreak: Що станеться, якщо ви почнете з числа 1, розділіть на 2 і округніть непарним? Ви отримуєте 0,5 округлення до 1. Що робити, якщо ви знову розділите на 2? Ви отримуєте 0,5 округлення до 1. І так далі. Ніколи не стає нулем.
gnasher729

13
Я думаю, що парним числам також слід віддати перевагу непарних чисел, оскільки вони знижують ймовірність необхідності подальших дилем округлення. Поділ (саме) на два є досить частою операцією на практиці.
Марк ван Левен

4
Це важливо і в статистиці. Якщо кожен дробовий член набору даних округлюється, описова статистика, така як середня, буде (трохи) вище, ніж якщо вона округлена вниз. Вступ Кеннета Ротмана в епідеміологію конкретно згадує завжди округлення терміналу .5 (або .005, або що завгодно), як поступово зміщення бази даних у бік більшої кількості, але завжди округлення до парного чи непарного числа не зміщує середнє значення.
Буде Мерфі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.