Языки программирования, такие как Scheme (R5RS) и Python ( см. Этот Вопрос ), округляются до ближайшего четного целого числа, когда значение находится точно между окружающими целыми числами.
В чем причина этого?
Есть ли математическая идея, которая облегчает рассуждение о следующих вычислениях?
(R5RS ссылается на стандарт IEEE с плавающей точкой как источник этого поведения.)
scheme
numbers
numeric-precision
python-3.x
Profpatsch
источник
источник
Ответы:
Некоторое время назад я создал тестовую программу для последовательного округления, потому что это в основном стресс-тест в худшем случае для алгоритма округления.
Для каждого числа от 0 до 9 999 оно сначала округляется до ближайших 10, затем до ближайших 100, затем до ближайшей 1000. (Вы также можете думать об этом как о 10000 точек в [0,1), округленных до 3 мест, затем до 2, затем до 1.) Этот набор чисел имеет среднее значение 4999,5.
Если все три закруглений выполнены с использованием методы «круглый половина вверх», то результаты выглядят следующим образом (первый столбец округление результата, второй столбец как много чисел с округлением до этого результата - т.е. это гистограмма).
Результат отличается от одной «округленной половины» до ближайшей тысячи 550 раз из 10000, а среднее округленное значение составляет 5055 (выше исходного среднего на 55,5).
Если все три округления выполняются с помощью «округления до половины», то получаются следующие результаты:
Результат отличается от одной «округленной половины вниз» до ближайшей тысячи 550 раз из 10000, а среднее округленное значение составляет 4944 (слишком мало для 55,5).
Если все три округления выполнены с использованием «округлой половины нечетной», результат будет следующим:
Результат отличается от одной «округлой половины нечетного» до ближайшей тысячи 550 раз из 10000, а среднее округленное значение равно 4999,5 (правильно).
Наконец, если все три округления выполняются с использованием «округления до половины», получаются следующие результаты:
Результат отличается от одной «округленной половины» до ближайшей тысячи в 450 раз из 10000, а среднее округленное значение равно 4999,5 (правильно).
Я думаю, что очевидно, что округление наполовину вверх и округление наполовину вниз смещает округленные значения, так что среднее значение округленных значений больше не соответствует ожидаемым средним значениям исходных значений, и что «округление наполовину четное» и «округление наполовину нечетное» «Устранить смещение, обрабатывая 5 в одну сторону, а другую половину - в другую. Последовательное округление умножает смещение.
Круглая половина четная и круглая половина нечетная вносят свой собственный характер смещения в распределение: смещение в сторону четных и нечетных цифр соответственно. В обоих случаях, опять же, это смещение умножается на последовательное округление, но оно хуже для половины нечетного раунда. Я думаю, что объяснение в этом случае простое: 5 - нечетное число, поэтому половина нечетного раунда имеет больше результатов, заканчивающихся на 5, чем четная половина раунда - и, следовательно, больше результатов, которые должны будут обрабатываться специально при следующем округлении.
Так или иначе, из четырех вариантов, только два являются беспристрастными, а из двух несмещенных вариантов круглая половина даже дает наилучшее распределение при условии повторного округления.
источник
Это называется банковским округлением. Идея состоит в том, чтобы минимизировать накопленную ошибку от многих операций округления.
Допустим, вы всегда округлились .5 вниз. Подумайте обо всех этих небольших процентных выплатах, каждый раз, когда банк каждый раз получает по пол цента ...
Допустим, вы всегда округлились на .5. Бухгалтерский учет будет кричать, потому что вы платите больше процентов, чем должны.
источник