Почему некоторые языки округляются до ближайшего целого числа?


44

Языки программирования, такие как Scheme (R5RS) и Python ( см. Этот Вопрос ), округляются до ближайшего четного целого числа, когда значение находится точно между окружающими целыми числами.

В чем причина этого?
Есть ли математическая идея, которая облегчает рассуждение о следующих вычислениях?

(R5RS ссылается на стандарт IEEE с плавающей точкой как источник этого поведения.)


4
Вы читали с плавающей точкой- gui.de ?
Василий Старынкевич

1
IEEE допускает режим множественного округления. Это одна из них. Некоторые языки даже позволяют изменять режим округления во время выполнения.
Тобиас Брандт

5
Возможно, вы захотите прочитать раздел « Разрыв связи » для округления Википедии и рассуждений об ассоциации каждого из них.


1
«хотя точное значение - это предмет обсуждения с числами с плавающей запятой». Это не предмет обсуждения, это определено очень точно. Например, числа, которые здесь важны (например, 42,5), могут быть представлены точно, потому что они являются двоичными дробями. То, что не может быть представлено точно, - это дробные части, в том числе десятичные дроби.
svick

Ответы:


39

Некоторое время назад я создал тестовую программу для последовательного округления, потому что это в основном стресс-тест в худшем случае для алгоритма округления.

Для каждого числа от 0 до 9 999 оно сначала округляется до ближайших 10, затем до ближайших 100, затем до ближайшей 1000. (Вы также можете думать об этом как о 10000 точек в [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 раз из 10000, а среднее округленное значение составляет 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 раз из 10000, а среднее округленное значение составляет 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.