Вопрос с округлениями

Автор Alter, 01 июня 2022, 23:32:02

« назад - далее »

Alter

Итак. В январе 2020 это уже поднималось. Но сегодня снова возник скользкий прецедент.
Хочу спросить у автора форума, почему принята такая бескомпромиссная позиция округления пятерок в сотых - до наибольшего по абсолютному значению десятого?

Vasilii

Так это ж обычная арифметика:
0, 1, 2, 3, 4 - меньше
5, 6, 7, 8, 9 - больше.

Kostian

Курс на холодный январь!

Vasilii

Другое дело - двойное округление:
0.0495
0.05
0.1
Если мы сразу округлим до десятых, то получится 0, а если сначала до сотых, а потом до десятых, то получится 0.1 ;D

Alter

Цитата: Vasilii от 01 июня 2022, 23:40:18
Так это ж обычная арифметика:
0, 1, 2, 3, 4 - меньше
5, 6, 7, 8, 9 - больше.
Меньше чего? Это правило действенно только тогда, когда за указанным порядком есть любой другой.
18,845 округляется до 18,8.
18,854 до 18,9.

А когда цифра одна, то начнем с того, что в таком варианте 0 - это вообще не цифра, ее нет в этом случае, понимаете?
нет никакого +18,80 ровно, это и есть +18,8 - или я могу написать вместо него какое-нибудь +18,8000000 - это не будет иметь никакого смысла.
Остается лишь 9 цифр: 1,2,3,4,5,6,7,8,9
1,2,3,4 - меньше.
6,7,8,9 - больше.
5 - ни туда и ни сюда.

Kostian, однобокое округление приводит к накоплению лишних градусов. Быть может, эффект и минимален, но он есть.
Округлять 5 можно:
1. До меньшего
2. До большего
3. До ближайшего четного.
Вот и еще раз вопрос, почему именно до большего?

Alter

#5
Цитата: Vasilii от 02 июня 2022, 00:00:04
Другое дело - двойное округление:
0.0495
0.05
0.1
Если мы сразу округлим до десятых, то получится 0, а если сначала до сотых, а потом до десятых, то получится 0.1 ;D
Ну вот хороший пример. На 3-й итерации уже ошибка.
Известно, что исходное число ближе к 0, чем к 0,1.
А по Вашей кривой якобы "методике" оно превращается в 0,1. Полный бред.
При первом округлении по корректной методике мы как раз смотрим на "4 - меньше". И сразу превращаем его в 0,0.

Alter

#6
ЦитироватьОкругление наполовину до четного
Правило тай-брейка без положительного / отрицательного смещения и без смещения в сторону / от нуля округляет половину до четного. По этому соглашению, если дробная часть xравна 0,5, то yявляется четным целым числом, ближайшим к x. Так, например, +23.5 становится +24, как и +24.5; однако -23.5 становится -24, как и -24.5. Эта функция минимизирует ожидаемую ошибку при суммировании по округленным цифрам, даже если входные данные в основном положительные или в основном отрицательные, при условии, что они не являются ни в основном четными, ни в основном нечетными.
В школе преподают вещи, которые нужны в обиходе. В точных науках надо стремиться использовать не бытовые "фишки", а то, что минимизирует ошибки. Так что неважно, что именно преподавали в школе. Тем более, что все считается ЭВМ, алгоритм округления настроить - пара пустяков.
Случайные цифры в десятых климатического ряда не являются ни в основном четными, ни нечетными. Частота таких цифр в данных стремится к 50%. Вполне удобный и справедливый критерий округления.
И отвечая на вопрос "как должно быть". Должно быть максимально точно. А не так, как "учили в 3 классе".

Vasilii

Цитата: Alter от 02 июня 2022, 00:11:45
Ну вот хороший пример. На 3-й итерации уже ошибка.
Этот пример ничего общего с реальностью не имеет. Округляют сразу до нужной дробной части.

Цитата: Alter от 02 июня 2022, 00:08:55
что в таком варианте 0 - это вообще не цифра
Здесь речь не о цифрах, а о числах. Если представить число, в виде записи с сотыми, то, как я уже привёл пример в другой теме должен быть баланс: чисел от 5.00 до 5.99 должно быть одинаковое кол-во. От 5.00 до 5.49 и от 5.50 до 5.99 по 50

Во всех научных исследованиях, программах и прочих экселях - естественно так всё это и работает.

Alter

#8
Цитата: Vasilii от 02 июня 2022, 00:23:26

Здесь речь не о цифрах, а о числах. Если представить число, в виде записи с сотыми, то, как я уже привёл пример в другой теме должен быть баланс: чисел от 5.00 до 5.99 должно быть одинаковое кол-во. От 5.00 до 5.49 и от 5.50 до 5.99 по 50

Во всех научных исследованиях, программах и прочих экселях - естественно так всё это и работает.
Абсолютно непрактично. Красиво, но глупо. Изучите вопрос что ли. Википедию почитайте для начала. "Все так работает" - это вообще дилетантское заявление. Сейчас большой выбор режимов округления.
ЦитироватьОтдельного описания требуют правила округления для специального случая, когда (N+1)-й знак = 5, а последующие знаки равны нулю. Если во всех остальных случаях округление до ближайшего целого обеспечивает меньшую погрешность округления, то данный частный случай характерен тем, что для однократного округления формально безразлично, производить его «вверх» или «вниз» — в обоих случаях вносится погрешность ровно в 1/2 младшего разряда. Существуют следующие варианты правила округления до ближайшего целого для данного случая:

Математическое округление[источник не указан 540 дней] — округление всегда в бо́льшую по модулю сторону (предыдущий разряд всегда увеличивается на единицу).
Округление до ближайшего чётного (в английском языке известно под названием англ. banker's rounding — «округление банкира») — округление для этого случая происходит к ближайшему чётному числу, то есть 2,5 → 2; 3,5 → 4.
Случайное округление — округление происходит в меньшую или большую сторону в случайном порядке, но с равной вероятностью (может использоваться в статистике).
Чередующееся округление — округление происходит в меньшую или большую сторону поочерёдно.
Во всех вариантах в случае, когда (N+1)-й знак не равен 5 или последующие знаки не равны нулю, округление происходит по обычным правилам: 2,49 → 2; 2,51 → 3.

Математическое округление просто формально соответствует общему правилу округления (см. выше). Его недостатком является то, что при округлении большого числа значений, которые далее будут обрабатываться совместно, может происходить накопление ошибки округления. Типичный пример: округление до целых рублей денежных сумм, выражаемых в рублях и копейках. В реестре из 10 000 строк (если считать копеечную часть каждой суммы случайным числом с равномерным распределением, что обычно вполне допустимо) окажется в среднем около 100 строк с суммами, содержащими в части копеек значение 50. При округлении всех таких строк по правилам математического округления «вверх» сумма «итого» по округлённому реестру окажется на 50 рублей больше точной.

Три остальных варианта как раз и придуманы для того, чтобы уменьшить общую погрешность суммы при округлении большого количества значений. Округление «до ближайшего чётного» исходит из предположения, что при большом числе округляемых значений, имеющих 0,5 в округляемом остатке, в среднем половина из них окажется слева, а половина — справа от ближайшего чётного, таким образом, ошибки округления взаимно погасятся. Строго говоря, предположение это верно лишь тогда, когда набор округляемых чисел обладает свойствами случайного ряда, что обычно верно в бухгалтерских приложениях, где речь идёт о ценах, суммах на счетах и так далее. Если же предположение будет нарушено, то и округление «до чётного» может приводить к систематическим ошибкам. Для таких случаев лучше работают два следующих метода.

Два последних варианта округления гарантируют, что примерно половина специальных значений будет округлена в одну сторону, половина — в другую. Но реализация таких методов на практике требует дополнительных усилий по организации вычислительного процесса.

Округление в случайную сторону требует для каждой округляемой строки генерировать случайное число. При использовании псевдослучайных чисел, создаваемых линейным рекуррентным методом, для генерации каждого числа требуется операция умножения, сложения и деления по модулю, что для больших объёмов данных может существенно замедлить расчёты.
Чередующееся округление требует хранить флаг, показывающий, в какую сторону последний раз округлялось специальное значение, и при каждой операции переключать значение этого флага.
Ну если у Вас есть научное исследование, доказывающее, что метод округление "пятерок" до большего целого является более корректным в отношении вероятных ошибок, нежели вышеперечисленные, то прошу его сюда.
Пока одни голословные утверждения.
Википедия в данном случае лучше множества других источников - научные статьи там проходят достаточно жесткую и справедливую проверку. Чего конечно не скажешь о проверках в статьях гуманитарного толка, от чего у некоторых к википедии образовалось весьма негативное отношение. Но она конечно не претендует на строгую научность, поэтому готов при изучении реально научной математической статьи на тему округления принять Вашу точку зрения. Сейчас она абсолютно неубедительно. Ошибка накапливается, а нам зачем-то нужно равенство чисел. Ну и околесица.

Kostian

Цитата: Alter от 02 июня 2022, 00:08:55
Округлять 5 можно:
1. До меньшего
2. До большего
3. До ближайшего четного.
Вот и еще раз вопрос, почему именно до большего?

Потому что по умолчанию функция производит математическое округление. Чтобы округлять, к примеру, до ближайшего четного, нужно использовать дополнительные параметры, такие как PHP_ROUND_HALF_EVEN.
Курс на холодный январь!

Alter

Kostian, спасибо. Значит, не думали над этим вопросом. Ну вот, подкинул пищу для размышлений.
Систематические ошибки самих измерений, наверно, дадут и дают большую сумму накопленных отклонений, но это не отменяет того факта, что желательно бы бороться со всеми вероятными систематическими ошибками. Никогда не знаешь, что, где и когда вылезет. Пусть даже вероятность равна каких-нибудь 0,5%. Мы имеем дело с погодой и климатом и знаем, что может быть почти все, что угодно ;D

Vasilii

Цитата: Alter от 02 июня 2022, 00:56:50
дадут и дают большую сумму накопленных отклонений
Та погрешность, которая существует в метеорологических базах ничто с копейками из реестра в 10 000 строк  :)
Взять хотя бы неточность вычисления средней по суткам, а не по срокам, там ваша неточность с округлением пятёрки точно будет в пределах погрешности, которую можно опустить...

Vasilii

За 10000 месяцев получается накопится 0.005 ошибка средней (если сумма 50 за 10000 строк, в примере с баблом)?
За 2000 месяцев (167 лет наблюдений, к примеру) 0.001 градуса (одна тысячная градуса) :)

Vasilii

#13
Alter, да и к тому же, я тут подумал с утреца, а что там с сотыми? Можете мне привести хоть один месяц с ровными сотыми в конце? Например, 18.85. Есть такие вообще? :D
А округлять, к примеру, 18.851 или 18.85001454 можно только строго до 18.9, если округляем до десятых (а мы и округляем всё до десятых), все другие практики в данном случае абсурдны, бессмысленны и ложны.
Они применимы только к числам, оканчивающимся строго на 5. А в случайном распределение, где есть 18.85001 будет когда-то и 18.84999...

Vasilii

Цитата: Vasilii от 02 июня 2022, 07:37:36
Например, 18.85. Есть такие вообще? :D
Хотя должны быть. Вероятность 1 к 30, да и то в месяцах, где кол-во дней чётное, т.е. 1 раз в 5 лет.
Получается ещё 0.001 надо на 30 разделить :o
Эта погрешность просто абсолютное ничто с погрешностями измерений, к примеру, или со сложением суток, а не сроков...